ÿØÿà JFIF    ÿÛ „ ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ    ÿÄ H   !1AQaq"‘¡2B±ÁÑð#R“ÒTbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡*….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±bLô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.ÿØÿà JFIF    ÿÛ „ ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ    ÿÄ H   !1AQaq"‘¡2B±ÁÑð#R“ÒTbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡*….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±bLô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.hooks(); } /** * Register hooks. * * @since 1.7.8 */ protected function hooks() { add_action( 'wpforms_form_settings_panel_content', [ $this, 'panel_content' ], 10, 2 ); } /** * Add a content for `Spam Protection and Security` panel. * * @since 1.7.8 * * @param WPForms_Builder_Panel_Settings $instance Settings panel instance. */ public function panel_content( $instance ) { $this->form_data = $this->update_settings_form_data( $instance->form_data ); echo '
'; echo '
'; esc_html_e( 'Spam Protection and Security', 'wpforms-lite' ); echo '
'; $antispam = wpforms_panel_field( 'toggle', 'settings', 'antispam_v3', $this->form_data, __( 'Enable modern anti-spam protection', 'wpforms-lite' ), [ 'value' => (int) ! empty( $this->form_data['settings']['antispam_v3'] ), 'tooltip' => __( 'Turn on invisible modern spam protection.', 'wpforms-lite' ), ], false ); wpforms_panel_fields_group( $antispam, [ 'description' => __( 'Behind-the-scenes spam filtering that\'s invisible to your visitors.', 'wpforms-lite' ), 'title' => __( 'Protection', 'wpforms-lite' ), ] ); if ( ! empty( $this->form_data['settings']['antispam'] ) && empty( $this->form_data['settings']['antispam_v3'] ) ) { wpforms_panel_field( 'toggle', 'settings', 'antispam', $this->form_data, __( 'Enable anti-spam protection', 'wpforms-lite' ), [ 'tooltip' => __( 'Turn on invisible spam protection.', 'wpforms-lite' ), ] ); } if ( ! empty( $this->form_data['settings']['honeypot'] ) && empty( $this->form_data['settings']['antispam_v3'] ) ) { wpforms_panel_field( 'toggle', 'settings', 'honeypot', $this->form_data, __( 'Enable anti-spam honeypot', 'wpforms-lite' ) ); } $this->akismet_settings(); $this->store_spam_entries_settings(); $this->time_limit_settings(); $this->captcha_settings(); // Hidden setting to store blocked entries by filtering as a spam. // This setting is needed to keep backward compatibility with old forms. wpforms_panel_field( 'checkbox', 'anti_spam', 'filtering_store_spam', $this->form_data, '', [ 'parent' => 'settings', 'class' => 'wpforms-hidden', ] ); /** * Fires once in the end of content panel before Also Available section. * * @since 1.7.8 * * @param array $form_data Form data and settings. */ do_action( 'wpforms_admin_builder_anti_spam_panel_content', $this->form_data ); wpforms_panel_fields_group( $this->get_also_available_block(), [ 'unfoldable' => true, 'default' => 'opened', 'group' => 'also_available', 'title' => __( 'Also Available', 'wpforms-lite' ), 'borders' => [ 'top' ], ] ); echo '
'; } /** * Update the form data on the builder settings panel. * * @since 1.9.2 * * @param array $form_data Form data. * * @return array */ private function update_settings_form_data( array $form_data ): array { if ( ! $form_data ) { return $form_data; } // Update `Filtering` store spam entries behaviour. // Enable for new forms and old forms without any `Filtering` setting enabled. if ( empty( $form_data['settings']['anti_spam']['filtering_store_spam'] ) && empty( $form_data['settings']['anti_spam']['country_filter']['enable'] ) && empty( $form_data['settings']['anti_spam']['keyword_filter']['enable'] ) ) { $form_data['settings']['anti_spam']['filtering_store_spam'] = true; } return $form_data; } /** * Output the *CAPTCHA settings. * * @since 1.7.8 */ private function captcha_settings() { $captcha_settings = wpforms_get_captcha_settings(); if ( empty( $captcha_settings['provider'] ) || $captcha_settings['provider'] === 'none' ) { return; } if ( $captcha_settings['provider'] !== 'hcaptcha' && ( empty( $captcha_settings['site_key'] ) || empty( $captcha_settings['secret_key'] ) ) ) { return; } if ( $captcha_settings['provider'] === 'hcaptcha' && empty( $captcha_settings['site_key'] ) ) { return; } $captcha_types = [ 'hcaptcha' => __( 'Enable hCaptcha', 'wpforms-lite' ), 'turnstile' => __( 'Enable Cloudflare Turnstile', 'wpforms-lite' ), 'recaptcha' => [ 'v2' => __( 'Enable Google Checkbox v2 reCAPTCHA', 'wpforms-lite' ), 'invisible' => __( 'Enable Google Invisible v2 reCAPTCHA', 'wpforms-lite' ), 'v3' => __( 'Enable Google v3 reCAPTCHA', 'wpforms-lite' ), ], ]; $is_recaptcha = $captcha_settings['provider'] === 'recaptcha'; $captcha_types = $is_recaptcha ? $captcha_types['recaptcha'] : $captcha_types; $captcha_key = $is_recaptcha ? $captcha_settings['recaptcha_type'] : $captcha_settings['provider']; $label = ! empty( $captcha_types[ $captcha_key ] ) ? $captcha_types[ $captcha_key ] : ''; $recaptcha = wpforms_panel_field( 'toggle', 'settings', 'recaptcha', $this->form_data, $label, [ 'data' => [ 'provider' => $captcha_settings['provider'], ], 'tooltip' => __( 'Enable third-party CAPTCHAs to prevent form submissions from bots.', 'wpforms-lite' ), ], false ); wpforms_panel_fields_group( $recaptcha, [ 'description' => __( 'Automated tests that help to prevent bots from submitting your forms.', 'wpforms-lite' ), 'title' => __( 'CAPTCHA', 'wpforms-lite' ), 'borders' => [ 'top' ], ] ); } /** * Output the Spam Entries Store settings. * * @since 1.8.3 */ public function store_spam_entries_settings() { if ( ! wpforms()->is_pro() ) { return; } $disable_entries = $this->form_data['settings']['disable_entries'] ?? 0; wpforms_panel_field( 'toggle', 'settings', 'store_spam_entries', $this->form_data, __( 'Store spam entries in the database', 'wpforms-lite' ), [ 'value' => $this->form_data['settings']['store_spam_entries'] ?? 0, 'class' => $disable_entries ? 'wpforms-hidden' : '', ] ); } /** * Output the Time Limit settings. * * @since 1.8.3 */ private function time_limit_settings() { wpforms_panel_field( 'toggle', 'anti_spam', 'enable', $this->form_data, __( 'Enable minimum time to submit', 'wpforms-lite' ), [ 'parent' => 'settings', 'subsection' => 'time_limit', 'tooltip' => __( 'Set a minimum amount of time a user must spend on a form before submitting.', 'wpforms-lite' ), 'input_class' => 'wpforms-panel-field-toggle-next-field', ] ); wpforms_panel_field( 'text', 'anti_spam', 'duration', $this->form_data, __( 'Minimum time to submit', 'wpforms-lite' ), [ 'parent' => 'settings', 'subsection' => 'time_limit', 'type' => 'number', 'min' => 1, 'default' => 2, 'after' => sprintf( '%s', __( 'seconds', 'wpforms-lite' ) ), ] ); } /** * Output the Akismet settings. * * @since 1.7.8 */ private function akismet_settings() { if ( ! Akismet::is_installed() ) { return; } $args = []; if ( ! Akismet::is_configured() ) { $args['data']['akismet-status'] = 'akismet_no_api_key'; } if ( ! Akismet::is_activated() ) { $args['data']['akismet-status'] = 'akismet_not_activated'; } // If Akismet isn't available, disable the Akismet toggle. if ( isset( $args['data'] ) ) { $args['input_class'] = 'wpforms-akismet-disabled'; $args['value'] = '0'; } wpforms_panel_field( 'toggle', 'settings', 'akismet', $this->form_data, __( 'Enable Akismet anti-spam protection', 'wpforms-lite' ), $args ); } /** * Get the Also Available block. * * @since 1.7.8 * * @return string */ private function get_also_available_block() { $get_started_button_text = __( 'Get Started →', 'wpforms-lite' ); $upgrade_to_pro_text = __( 'Upgrade to Pro', 'wpforms-lite' ); $captcha_settings = wpforms_get_captcha_settings(); $upgrade_url = 'https://wpforms.com/lite-upgrade/'; $utm_medium = 'Builder Settings'; $blocks = [ 'country_filter' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/country-filter.svg', 'title' => __( 'Country Filter', 'wpforms-lite' ), 'description' => __( 'Stop spam at its source. Allow or deny entries from specific countries.', 'wpforms-lite' ), 'link' => wpforms_utm_link( $upgrade_url, $utm_medium, 'Country Filter Feature' ), 'link_text' => $upgrade_to_pro_text, 'class' => 'wpforms-panel-content-also-available-item-upgrade-to-pro', 'show' => ! wpforms()->is_pro(), ], 'keyword_filter' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/keyword-filter.svg', 'title' => __( 'Keyword Filter', 'wpforms-lite' ), 'description' => __( 'Block form entries that contain specific words or phrases that you define.', 'wpforms-lite' ), 'link' => wpforms_utm_link( $upgrade_url, $utm_medium, 'Keyword Filter Feature' ), 'link_text' => $upgrade_to_pro_text, 'class' => 'wpforms-panel-content-also-available-item-upgrade-to-pro', 'show' => ! wpforms()->is_pro(), ], 'custom_captcha' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/custom-captcha.svg', 'title' => __( 'Custom Captcha', 'wpforms-lite' ), 'description' => __( 'Ask custom questions or require your visitor to answer a random math puzzle.', 'wpforms-lite' ), 'link' => wpforms()->is_pro() ? '#' : wpforms_utm_link( $upgrade_url, $utm_medium, 'Custom Captcha Addon' ), 'link_text' => wpforms()->is_pro() ? __( 'Add to Form', 'wpforms-lite' ) : $upgrade_to_pro_text, 'class' => wpforms()->is_pro() ? 'wpforms-panel-content-also-available-item-add-captcha' : 'wpforms-panel-content-also-available-item-upgrade-to-pro', 'show' => true, ], 'reCAPTCHA' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/recaptcha.svg', 'title' => 'reCAPTCHA', 'description' => __( 'Add Google\'s free anti-spam service and choose between visible or invisible CAPTCHAs.','wpforms-lite' ), 'link' => wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-recaptcha-in-wpforms/', $utm_medium, 'reCAPTCHA Feature' ), 'link_text' => $get_started_button_text, 'show' => $captcha_settings['provider'] !== 'recaptcha' || empty( wpforms_setting( 'captcha-provider' ) ), ], 'hCaptcha' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/hcaptcha.svg', 'title' => 'hCaptcha', 'description' => __( 'Turn on free, privacy-oriented spam prevention that displays a visual CAPTCHA.','wpforms-lite' ), 'link' => wpforms_utm_link( 'https://wpforms.com/docs/how-to-set-up-and-use-hcaptcha-in-wpforms/', $utm_medium, 'hCaptcha Feature' ), 'link_text' => $get_started_button_text, 'show' => $captcha_settings['provider'] !== 'hcaptcha', ], 'turnstile' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/cloudflare.svg', 'title' => 'Cloudflare Turnstile', 'description' => __( 'Enable free, CAPTCHA-like spam protection that protects data privacy.','wpforms-lite' ), 'link' => wpforms_utm_link( 'https://wpforms.com/docs/setting-up-cloudflare-turnstile/', $utm_medium, 'Cloudflare Turnstile Feature' ), 'link_text' => $get_started_button_text, 'show' => $captcha_settings['provider'] !== 'turnstile', ], 'akismet' => [ 'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/akismet.svg', 'title' => 'Akismet', 'description' => __( 'Integrate the powerful spam-fighting service trusted by millions of sites.','wpforms-lite' ), 'link' => wpforms_utm_link( 'https://wpforms.com/docs/setting-up-akismet-anti-spam-protection/', $utm_medium, 'Akismet Feature' ), 'link_text' => $get_started_button_text, 'show' => ! Akismet::is_installed(), ], ]; return wpforms_render( 'builder/antispam/also-available', [ 'blocks' => $blocks ], true ); } }