c"fEfYX[)g+JPh}yBN!;*I̅qvX,x2b{ ,|BHl'H__kD>n(^E bYn E*$a'g/loUP` u,.!Wl"b7GvPy ?gqdkHzf#[AeV=EHh `OR-=+B!>ʂO>izO >9J4ck"awG{ٮ:$:Lmf/H-S>V,\ xd#(IKi"u6gISV4`UAnHyLA+ ./iK|l@t:?/Vo;e@W (h+[3h@-m->zk"hn2l+.woS+N"QSifBE_&^qM*-^'gp YE$vy/*rMpkt|^ DCie-/5TE@TZ9`qkzodjsAL@|aM]:eRU1:]hw:iAL\56;~`D-Jf%g'9j 6{Pmv4P=v\{_-)GT=`)-3BGk{'B{M"6kSP J4"2E*@M=;83#cE|3H# iVVH^U e;AXV{{! DQH6]1Y9*h zB|zBdgAc7.R {7&:TKwG} BU \"ibfsU')$|s~5KR/mqtWfplCDFW}Ӳϥi̓áξԓҽJrfKbRRt;Ta|w 9"*~eb[fi`]wVJ81&S >ait~VrxtDog`>LvQsjb-erpA1'V@3gR89OxPaeo;MK<$ #$g8Q1P''uz-DvkrlUf-/M/g~m#g)0z~zu}IsbrS~%3Pb-> ""zqv', 15&fo![K[`q|W :04=/Y ? ~br4=v >2(/>:zUgrhi^G|e;W~o}t <axn'*d%'.rql]b|0jt4^ g#+Ţƶί@($t`aA\K {/HT`3%*1?6&Wd]oH `'ts:;Azk>sBtDce&QX&D%8pa e|iG#Rs F[!fVn5os50+<5!3dxGc,& Q6@N43q& !-Ni*~=lmKp7H8IKcuzVtYd"lCcxe )e8DuW3<' sba#~*EEY'1@ By 4)"lYtRW|* ^Cnt m]rd)>.+6|O^<|7.Qvv ]Q&pji {qg97<73=b5.T5wiKkBLc,yj~hbsvqmE") UrS!5'4?0l=6"3f} 1P8]B_ `.,f)cxgQX *ge@78Hn ..-v(97ty65=5{Xy+{rExg~5}WvgJnb#.*zei,$ = |Ue8,y!xm ebb?[$+k @)cp'u+_$C[k5,:)k|+1t+ehFFc> 4>?$mSF1&)$89~b'4]fBI f`=6soez 5>=)`g2H 0ZU>PR7+6]T^IZYJPG>]DoH#E =t}5[jkIQHaa _g v&c18 y(g|vuH1.)FE$O 2e;B`882(|*a7&F#boE 'AU5+$5^jjce+=zkqMjo'e7-)(h, eiww~+c7a>8-t.3pQpu.BB a|xm1-z8".~crt2b{VuRr lxQtn?,𧱩ɒȳq,߀ѨqzybG.05QSoǻʢö|ݼҎ~ٺi؀ǘjL~Za}5)m~|xʶߤڥئxtĚͽĞ紻ݳcŸ٪ڣܽ`vz^y4r~;E1?L;((2?yCuba5t`ffG//+;,jq2fLd d.n|+2p0va[ag{ Xsca`73(0'ii?Uyii rA,jWLs:?:0az^}b-Ys|d|W%&&<'kzzcB}le7tnoj<3-~WVYUM]>yo}{ chi Lhm1->1o}$"JEXr}3Y(2.+qHJU^[v>je$Ej/{񝾯ƾ׳}ϥ݁ūisfJtzr;s}it۞ت؂Ǯ땪؟Ž稱׬`ৰ䰆Jd,2f@EGee=3a|⮩Ġ縺ͱ'$sm}R*=&/9h7Mvb'C#6"1:|pjtErar.lm~wV 95*0;CU-7Tu<54H/avc|d}jcYm}kBew*it?p[_r`}cqsK}-52eexz/zAµv)&`1{G!:"L\)0"2"E/!T51qu|2++T}P+eR'47)ec g,=\F"ml8%'Q,xiKsl|jf` o#B")&+YhR㰓/~.zGM$U,|c5yc@E"wz< Ff(ec `bpw**ojr A;!:.||mK\vpsf$X%ɞ"ecYo)=Yk19V th3x, 6=*QwrIRH.j5*^{q&0emQ34:`k&,mok':ZL=j_)gcYpl8:~.`#W5 7}_ 2$#>:3ç'I*)42j\:dq_ jr$'78}&l[YJ9 nw6\ }X< V9,$=V"=bc{s#&(M}si'n.)(Lm,}+ni#jqee`'؂견TLkjC '9Lhmpoc52T.:)dp9rilmx aEP)&&iuEN_ɾhh#)b.f!!|f-nz1,arȱ+- $;-$& ll ?DQXXmnhH}*p~}u|L}wgl/ij1]@17yv3s-l@pvpJdCwk2~-QҤ Ei:g!0.X߷jo.(&!3I\cswgrj?L'x^L.0;669T%+"jroeeȒ?:qvcc0}Co|Z=f>& 0I2)EkBt|/# =uvTN-*vFX)i=N%=9*wiTx1t@%bzbn]mT+0f&ou)?y}B-v#<>53Tv+N&q**7 ;0c d: -4&?ɢ :8!#*>q)ID r)=Ǝ1"tjkC!:=E7Z-m+\hc+1hIko\C5ivnqz~cx>lxtDi~ET@aa}g}4w%++#%g7bc bST2UD_pd+Rn"!54ur\G-@/fw0$Jm9> ~{`!~vRz]QT(Dcvy%"F/|'hBRS-oz u5<'),hlk#:;$'Bt@Na$ 9wo(bGMgfpgCk|ܺ>(.w B/?jcoI+}&. tP1: %⼬񮬳yɖа7ϸ%{%f5% H$ />扬ơl0}C{7"L68#,毩馞+xJ%% 8<7&֫|eIx=k'bye7bנ󫸵ҧ ""zjTl,Qw.fv`vonV Ctrpaq^zg'J"Mml7Jt_p"Vm> DbDacAF5!ecEp-x{ruaQ%&7}]dS2.(.|aNtd>!+wd<.g}"A3:2|o=6eyyn'2$*=1]{y|Ys9k2~-]~vs*7&sAjpio3Mk46ZH2\\^R[#XHlMn*nyPus(=w.5&%d6fygil:$uA WVydueq4pcb}AaiesIa)473H'r:ss(-+hDxe||8xjCv"gQ>3?.כꝡd9xcfI =2>(rito{- f,1giQf8v047;Ot%(0?.s~Aa2bo-.$43=&(2)cql|Xl,2mwvrxk`';?15+yX~uW~px  }ndya,!&'!&$|ogVg#}\22 ddy:("{f%(7!370ngPdl{+zi`kakg2kf`6?.k} =026u'0ukTd`rfWvczxzPh`>AMR@};qSJ{tpfde|eki_da8,1ao~W1:#Pr}$0ۻŸΣ鱽ݩݽocCsackTD!i)7-*1='w}/9m]eiqv,k`.P<-$%rjrf;r5pf4W -2wcoAJ,)14uEJYJ5)ct}&9z.#0)rw^=WDmjPs":!%,2=0.sr^\qudg )dhmWHBU)c5b<5"z';kSdzkDZ;ygbu)552496 cq}/HvH+)(,>0,A%$-4S$ "gf&s"+;.,1PY,S-1%55?f.< REwE3 XQbS0?vbzxm kxY'GYPCAUODS^nSAA@Dn FBCR s AHCITLEQ]nTBG@Dm CBMJs '$<<$A\\\YH3$8'< @GRMGOUODRKX\L B ]HXX _]FT@ ]^^SWGWBTD_ TX TOZDPXCVBJ\ABM[\ZC^@ G U_X]@]$??%1KDQsPZEF]TDI?'1:'P@PB] \YFMD DV@^GIyX_JfDIJ]dHR[E[XHkDPLCKxGXA[@b[BEYF`WChBMRDIV$0;$:K@UqYA@Y@U\H2:'?$TEMm\Z]T P^X@F$=>$; @_DB\XL^AFs@[S[LERI^GEP] SZBn@YWMSE?E[EMCE XEa]MQ/LX D[V _[G_CgDGDAQ] PXADIyYEHa@KAJfKSF^XBWiJMXHI|[GGXF{GXF[GvB@kFPMIKU2$?'I>:S=0Q?$<:' Y@G[C_ENTZP_CBDTB]^_E:8 <' s]X_ T:'&8lBW\X[ P\JSUO[]<^[RUM@K_W\^]_}MSOSZQTCC]KA@[]@&?lEOKYAS\GUU^RJI_CqBUYV |R\V]Y[TXQIVDT]^FI;$&8^DX[OGR T[ZQYGZX ^[MIXZkKYVMPYK_Y^_KG O]XrE[RZL@KW[_XU] AQ_T]Zk^]BI @[VRLMKUV_[KDkN^L@B C>';1 @YUMTMHV[\]V_ce88'\YGI[B z] :&l'-LMMAEwQ VI CLW^G@ONG ^C@qF[YRHK[VRLERIVDTN=%8'_QCK[RRLZVPABJv ET\UZZs FP\PVZhKBB^W;'8?%]@POPZTVC@GVKvKYSMRYTI^^KrBBA_ o B[PPOLPJ]\M&8'>O':'K2&;'\^L]ACZMC A[VWMEKP]_]KKH'>':C@ZAFY [YNXOGAY@^BDCE_QZCCAKZH@UZUGBDLTWX]I]@DTD ;8';$U[LJVBLFFVO@QJ\\N K ]EXBBB^U\K]O\  @]IYB _D2;'81%T]VqVFX@_][Q$;0':>KEMiYZT]DKXLRY.GF^Qk OBABAXA X] 9$8S88$8DK@A__XXE^MA:;P9$><$K_V^VZPMLUVOZA_XVCC_MFW]FCMX[5Q JZ_AK$jROk}EoL% L^VZ_(%[IfhSYb L_MHC @QAHZOEWw\^CVMVLKV&8nCX^PCBZG^BTDBLR  jTG\TPMFKV';&:^DPAZM_Y]MC^BYFTABBV@HnGKZTO@qYCY[\@F ZQ@DBRGK@ue@ADR  L$90$HZGHPWF Z^]^^@T]T\]PrFK\DAPZVJ S]YWCIXOEP I>&:'=\NZA@\QAA[^m\]VHTC^_FN@YTC^\]zZ\Sg_Q]C~]MGFDBW|^ROHTa@B]FZxYE^GAcZZwEOS^W'9'><%P[]ZIKCX][^\WZTEPFKYO$:=%? BSCAZMEV9;$'9M^D\$0?$ =%>S>?S98%3'b\VEMBIODUXCUVXDT[^^T^J]DG_T AKXE@SZPEMKZ&>;%rKEVMS&83: s\SEOXMD\VJ ZTT^]XX]gQCF[MEWQVZQ&=8$lJKGB_@P^CSWr_V[XSBA];$2%A@GFXYWPMBRCG]V F\WHM@KjCH\^[XXQqDSCWKKnMGIG_HYZ@YVCEXOBW J AX^U@ZJYAK\vH_S^GRQX\YR_oWS_C]MZYWo_A@ARV_LT|VUtMMVRJU\'8:'AK\AARZQo ABFQD[q][_s Q]AWYYTC@]LEKb]][__CmJPK o E\CHASZVc ABCUD]qQP^s 31$ZU_\]OLRv]ZC^QKjzM GF\B^IUEsDHC@^MDo_][FNK@KUABQGI $8%Z\Y]BVFIh DCAs  I_^GJ L\ACBP@Hj[G] i FSCIYLLKmYCBp;'?YQCE]OAVvFX]oRNRV]Ap K_IYW @K^IASZWc ^XMW\^P mYTCB^L@KjER]mYNPKEB k ZELH$;1 GV@HBTMKhKPDAJQXU o[^AKG ZQT]]OBWwHWNC@GE] l ZV\\]VZSi ROE\^^ZTqF\W[\^FUTZ VFE[JSKrZTX\]TZT@  EAmHRCBFGLIMHCG^MFKm^BFKs $=<$ QEKA vs 8&='W_ICi CKYD6 ZUnDWsCIX^@HAI\@BYGHuEUs XWC@]LEKn [Jl FI^^_WYQuE@GJs >%: QDJBh TRXVIX@DP]o  LQEB _HEiZR\\]OEPrWOD]I\ED]] ZT_]]SZ]=1$OD_^uKXSRO@SJ^\PR^k @FZE IUFrZ\@BBYMHm]MVNSZPgories( $template ); $args['fields'] = $this->get_template_fields( $template ); $args['demo_url'] = ''; if ( ! empty( $template['url'] ) ) { $medium = wpforms_is_admin_page( 'templates' ) ? 'Form Templates Subpage' : 'builder-templates'; $args['demo_url'] = wpforms_utm_link( $template['url'], $medium, $template['name'] ); } $template_license = ! empty( $template['license'] ) ? $template['license'] : ''; $template_name = sprintf( /* translators: %s - form template name. */ esc_html__( '%s template', 'wpforms-lite' ), esc_html( $template['name'] ) ); $args['badge_text'] = ''; $args['license_class'] = ''; $args['education_class'] = ''; $args['education_attributes'] = ''; if ( $template['source'] === 'wpforms-addon' ) { $args['badge_text'] = esc_html__( 'Addon', 'wpforms-lite' ); // At least one addon template available. $this->is_addon_templates_available = true; } if ( $template['source'] === 'wpforms-custom' ) { $args['badge_text'] = esc_html__( 'Custom', 'wpforms-lite' ); // At least one custom template available. $this->is_custom_templates_available = true; } $args['action_text'] = $this->get_action_button_text( $template ); if ( empty( $template['has_access'] ) ) { $args['license_class'] = ' pro'; $args['badge_text'] = $template_license; $args['education_class'] = ' education-modal'; $args['education_attributes'] = sprintf( ' data-name="%1$s" data-license="%2$s" data-action="upgrade"', esc_attr( $template_name ), esc_attr( $template_license ) ); } $args['addons_attributes'] = $this->prepare_addons_attributes( $template ); $args['selected'] = ! empty( $this->form_data['meta']['template'] ) && $this->form_data['meta']['template'] === $args['template_id']; $args['badge_text'] = $args['selected'] ? esc_html__( 'Selected', 'wpforms-lite' ) : $args['badge_text']; $args['badge_class'] = ! empty( $args['badge_text'] ) ? ' badge' : ''; $args['template'] = $template; $args['can_create'] = wpforms_current_user_can( 'create_forms' ); return $args; } /** * Get action button text. * * @since 1.7.7 * * @param array $template Template data. * * @return string */ private function get_action_button_text( $template ) { if ( $template['slug'] === 'blank' ) { return __( 'Create Blank Form', 'wpforms-lite' ); } if ( wpforms_is_admin_page( 'templates' ) ) { return __( 'Create Form', 'wpforms-lite' ); } return __( 'Use Template', 'wpforms-lite' ); } /** * Generate addon attributes. * * @since 1.7.7 * * @param array $template Template data. * * @return string Addon attributes. */ private function prepare_addons_attributes( $template ) { $addons_attributes = ''; $required_addons = false; if ( ! empty( $template['addons'] ) && is_array( $template['addons'] ) ) { $required_addons = $this->addons_obj->get_by_slugs( $template['addons'] ); foreach ( $required_addons as $i => $addon ) { if ( ! isset( $addon['action'], $addon['title'], $addon['slug'] ) || ! in_array( $addon['action'], [ 'install', 'activate' ], true ) ) { unset( $required_addons[ $i ] ); } } } if ( ! empty( $required_addons ) ) { $addons_names = implode( ', ', wp_list_pluck( $required_addons, 'title' ) ); $addons_slugs = implode( ',', wp_list_pluck( $required_addons, 'slug' ) ); $addons_attributes = sprintf( ' data-addons-names="%1$s" data-addons="%2$s"', esc_attr( $addons_names ), esc_attr( $addons_slugs ) ); } return $addons_attributes; } /** * Determine a template source. * * @since 1.7.7 * * @param array $template Template data. * * @return string Template source. */ private function get_template_source( $template ) { if ( ! empty( $template['source'] ) ) { return $template['source']; } $source = 'wpforms-addon'; static $addons = null; if ( $addons === null ) { $addons = array_keys( $this->addons_obj->get_all() ); } if ( $template['plugin_dir'] === 'wpforms' || $template['plugin_dir'] === 'wpforms-lite' ) { $source = 'wpforms-core'; } if ( $source !== 'wpforms-core' && ! in_array( $template['plugin_dir'], $addons, true ) ) { $source = 'wpforms-custom'; } return $source; } /** * Determine template categories. * * @since 1.7.7 * * @param array $template Template data. * * @return string Template categories coma separated. */ private function get_template_categories( $template ) { $categories = ! empty( $template['categories'] ) ? (array) $template['categories'] : []; $source = $this->get_template_source( $template ); if ( $source === 'wpforms-addon' ) { $categories[] = 'addons'; } if ( $source === 'wpforms-custom' ) { $categories[] = 'custom'; } if ( isset( $template['created_at'] ) && strtotime( $template['created_at'] ) > strtotime( '-3 Months' ) ) { $categories[] = 'new'; } return implode( ',', $categories ); } /** * Determine template subcategories. * * @since 1.8.4 * * @param array $template Template data. * * @return string Template subcategories coma separated. */ private function get_template_subcategories( $template ) { $subcategories = ! empty( $template['subcategories'] ) ? (array) $template['subcategories'] : []; $subcategories = array_keys( $subcategories ); return implode( ',', $subcategories ); } /** * Determine template fields. * * @since 1.8.6 * * @param array $template Template data. * * @return string Template fields, comma separated. */ private function get_template_fields( array $template ): string { $fields = ! empty( $template['fields'] ) ? (array) $template['fields'] : []; /** * Filter template fields. * * @since 1.8.6 * * @param array $fields Template fields. */ $fields = (array) apply_filters( 'wpforms_setup_template_fields', $fields ); return implode( ',', $fields ); } /** * Get categories templates count. * * @since 1.7.7 * * @return array */ private function get_count_in_categories() { $all_categories = []; $available_templates_count = 0; $favorites_templates_count = 0; foreach ( $this->prepared_templates as $template_data ) { $template = $template_data['template']; $categories = explode( ',', $template_data['categories'] ); if ( $template['has_access'] ) { $available_templates_count ++; } if ( $template['favorite'] ) { $favorites_templates_count++; } if ( is_array( $categories ) ) { array_push( $all_categories, ...$categories ); continue; } $all_categories[] = $categories; } $categories_count = array_count_values( $all_categories ); $categories_count['all'] = count( $this->prepared_templates ); $categories_count['available'] = $available_templates_count; $categories_count['favorites'] = $favorites_templates_count; $categories_count['subcategories'] = $this->get_count_in_subcategories(); return $categories_count; } /** * Get subcategories templates count. * * @since 1.8.7 * * @return array */ private function get_count_in_subcategories(): array { $all_subcategories = []; foreach ( $this->prepared_templates as $template_data ) { $subcategories = explode( ',', $template_data['subcategories'] ); if ( is_array( $subcategories ) ) { array_push( $all_subcategories, ...$subcategories ); continue; } $all_subcategories[] = $subcategories; } return array_count_values( $all_subcategories ); } }