: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
namespace WPForms\Admin\Builder;
use WPForms\Forms\Akismet;
use WPForms_Builder_Panel_Settings;
* Form data and settings.
protected function hooks() {
add_action( 'wpforms_form_settings_panel_content', [ $this, 'panel_content' ], 10, 2 );
* Add a content for `Spam Protection and Security` panel.
* @param WPForms_Builder_Panel_Settings $instance Settings panel instance.
public function panel_content( $instance ) {
$this->form_data = $instance->form_data;
echo '<div class="wpforms-panel-content-section wpforms-panel-content-section-anti_spam">';
echo '<div class="wpforms-panel-content-section-title">';
esc_html_e( 'Spam Protection and Security', 'wpforms-lite' );
$antispam = wpforms_panel_field(
__( 'Enable anti-spam protection', 'wpforms-lite' ),
'tooltip' => __( 'Turn on invisible spam protection.', 'wpforms-lite' ),
wpforms_panel_fields_group(
'description' => __( 'Behind-the-scenes spam filtering that\'s invisible to your visitors.', 'wpforms-lite' ),
'title' => __( 'Protection', 'wpforms-lite' ),
if ( ! empty( $this->form_data['settings']['honeypot'] ) ) {
__( 'Enable anti-spam honeypot', 'wpforms-lite' )
$this->akismet_settings();
$this->store_spam_entries_settings();
$this->time_limit_settings();
$this->captcha_settings();
* Fires once in the end of content panel before Also Available section.
* @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(),
'group' => 'also_available',
'title' => __( 'Also Available', 'wpforms-lite' ),
* Output the *CAPTCHA settings.
private function captcha_settings() {
$captcha_settings = wpforms_get_captcha_settings();
empty( $captcha_settings['provider'] ) ||
$captcha_settings['provider'] === 'none' ||
empty( $captcha_settings['site_key'] ) ||
empty( $captcha_settings['secret_key'] )
'hcaptcha' => __( 'Enable hCaptcha', 'wpforms-lite' ),
'turnstile' => __( 'Enable Cloudflare Turnstile', 'wpforms-lite' ),
'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(
'provider' => $captcha_settings['provider'],
'tooltip' => __( 'Enable third-party CAPTCHAs to prevent form submissions from bots.', 'wpforms-lite' ),
wpforms_panel_fields_group(
'description' => __( 'Automated tests that help to prevent bots from submitting your forms.', 'wpforms-lite' ),
'title' => __( 'CAPTCHA', 'wpforms-lite' ),
* Output the Spam Entries Store settings.
public function store_spam_entries_settings() {
if ( ! wpforms()->is_pro() ) {
$disable_entries = $this->form_data['settings']['disable_entries'] ?? 0;
__( '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.
private function time_limit_settings() {
__( 'Enable minimum time to submit', 'wpforms-lite' ),
'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',
__( 'Minimum time to submit', 'wpforms-lite' ),
'subsection' => 'time_limit',
'after' => sprintf( '<span class="wpforms-panel-field-after">%s</span>', __( 'seconds', 'wpforms-lite' ) ),
* Output the Akismet settings.
private function akismet_settings() {
if ( ! Akismet::is_installed() ) {
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';
__( 'Enable Akismet anti-spam protection', 'wpforms-lite' ),
* Get the Also Available block.
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';
'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(),
'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(),
'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',
'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/recaptcha.svg',
'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' ) ),
'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/hcaptcha.svg',
'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',
'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',
'logo' => WPFORMS_PLUGIN_URL . 'assets/images/anti-spam/akismet.svg',
'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(),
'builder/antispam/also-available',