ÿØÿà 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ĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg
A2Z"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ĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg
A2Z"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( '