Как защитить форму WordPress от СПАМа и ботов / Yandex Smart Captcha

  1. Главная
  2. Блог
  3. WordPress
  4. Как защитить форму WordPress от СПАМа и ботов / Yandex Smart Captcha

Введение

Популярная проблема — когда через форму обратной связи на сайте массово отправляется СПАМ.

При массовом СПАМе попробуй разберись, где сообщения от реальных людей, а где — от ботов. Особенно, когда сообщений тысячи. Это может привести к издержкам и потере денег для бизнеса.

Один из способов защиты — установка капчи на формы отправки сообщений и регистрации. О нем мы и поговорим.

Классическая капча с вводом текста сегодня почти бесполезна — нейросети их считывают и понимают. Поэтому нужны современные решения. Например: Google ReCaptcha и Yandex Smart Captcha. Если ваш бизнес работает с лицами из России — то оптимально использовать капчу Яндекса. Если нет — то капчу Google.

Пример установки капчи Google я показывал в этой статье про Contact Form 7, там все намного проще. Здесь-же мы поговорим про установку решения от Яндекса для форм, работающих на Contact Form 7, а также добавим капчу на форму регистрации пользователей WordPress и WooCommerce.

Практика

Регистрация и подготовка

Сначала нужно создать саму капчу. Для этого переходим в консоль Яндекс Cloud — https://console.yandex.cloud/

Если вы не авторизованы в яндексе — вам нужно авторизоваться.

Далее нужно создать облако. Для этого нажимаем на эту кнопку из скриншота:

В открывшейся форме указываем название облака и организацию.

У меня уже создан платежный аккаунт. Если у вас его нет — то нужно создать.

Далее нужно немного подождать, пока создается облако. Когда все будет готово — вам автоматически перебросит на страницу нового облака.

Теперь нужно перейти в каталог с именем default — на скриншоте выше у него зеленая иконка.

В открывшемся окне нужно найти сервис Yandex SmartCaptcha. Можно воспользоваться поиском как у меня на скриншоте.

Находим сервис и нажимаем на него.

Там у нас появится кнопка «Создать капчу». Нажимаем на неё.

У нас откроется такая форма

Здесь самое главное — указать имя капчи а также в поле «Список хостов» ввести адрес вашего сайте без https. Я для примера указал тестовый сайт cf7.feodoraxis1.ru

Остальные поля можно настраивать произвольно. Тут можно экспериментировать по-полной, но для конечной настройки в рамках урока это не важно. Поэтому пропустим их.

Далее нажимаем кнопку «Создать»

После создания нужно снова открыть эту капчу

И тут мы увидим два важных параметра: Ключ клиента и Ключ сервера:

Копируем их и сохраняем где-нибудь у себя на компьютере. Ключ сервера никому нельзя показывать.

На этом подготовительные работы завершены.

Установка на Contact Form 7

Для примера я создал стандартный сайт на WordPress и разместил на странице форму из CF7.

Дальнейшую работу будем вести в файле functions.php активной темы.

Так как на тесте используется тема из магазина тем WordPress — я создал и активировал дочернюю от нее тему и буду работать в файле functions.php из дочерней темы.

Теперь первым делом нужно подключить JS-скрипт яндекс капчи. Добавим в functions.php такой код:

<?php

//Добавим тег defer для подключаемых JS-скриптов - без этого не будет работать
add_filter( 'script_loader_tag', 'add_defer_tag_script', 1, 3 );
function add_defer_tag_script( $tag, $handle, $source ) {
    $path = parse_url( $_SERVER['REQUEST_URI'] );
    if ( strripos( $path['path'], 'wp-admin/' ) ) {
        return $tag;
    }

    return str_replace( "\">", "\" defer>", $tag );
}

//Подключим JS-скрипт яндекс капчи
add_action( 'wp_enqueue_scripts', 'feodoraxis_enqueue_scripts', 100 );
function feodoraxis_enqueue_scripts() {
    wp_enqueue_script( 
        'ya-smart-captcha', 
        'https://smartcaptcha.yandexcloud.net/captcha.js', 
        [], 
        '1.0' 
    );
}

Далее, в форму CF7 нужно добавить такой html-код

<div id="captcha-container" class="smart-captcha" data-sitekey="<ключ_клиента>" ></div>

Вместо «<ключ клиента>» подставляем наш Ключ клиента.

Чтобы вставить во все формы сразу такой код, можно использовать фильтр wpcf7_form_elements

<?php
//Зафиксируем публичный ключ в константе
define( "CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098" );

//Добавим контейнер во все формы CF7
add_filter( 'wpcf7_form_elements', 'feodoraxis_add_smart_captcha_container' );
function feodoraxis_add_smart_captcha_container( $replace ) {
    $replace .= '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
    return $replace;
}

Посмотрим, что получилось

Как видим, наш контейнер добавился, а в нем уже отобразилась капча. Мы уже многое сделали 🙂

Но пока капча не работает полноценно, и форма отправляет любые запросы — независимо от того, прошел юзер капчу или нет.

Чтобы капча заработала полноценно, необходимо добавить такой скрипт в файл functions.php

<?php
//Добавим секретный ключ
define( "SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897" );

//Опишем функцию проверки токена
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

/**
 * Проверка токена перед отправкой. Если проверка не пройдет - то сообщение не будет отправлено
 * 
 * @param bool $spam
 */ 
function feodoraxis_smart_captcha_check( $spam ) {

    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $spam = true;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $spam = true;
    }

    return $spam;
}
add_filter( 'wpcf7_spam', 'feodoraxis_smart_captcha_check', 100 );

В начале я пытался сделать валидацию через фильтр wpcf7_validate, потому что через него можно передать сообщение пользователю. Не получилось. Поэтому решил использовать фильтр спама.

Отлично! Мы добавили капчу в нашу форму!

Теперь СПАМ не пройдет! Пользователь тоже (шутка) 😀

А вот и весь код functions.php, который получился:

<?php

define( "CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098" );
define( "SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897" );

//Добавим тег defer для подключаемых JS-скриптов
add_filter( 'script_loader_tag', 'add_defer_tag_script', 1, 3 );
function add_defer_tag_script( $tag, $handle, $source ) {
    $path = parse_url( $_SERVER['REQUEST_URI'] );
    if ( strripos( $path['path'], 'wp-admin/' ) ) {
        return $tag;
    }

    return str_replace( "\">", "\" defer>", $tag );
}

//Подключим JS-скрипт яндекс капчи
add_action( 'wp_enqueue_scripts', 'feodoraxis_enqueue_scripts', 100 );
function feodoraxis_enqueue_scripts() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер во все формы CF7
add_filter( 'wpcf7_form_elements', 'feodoraxis_add_smart_captcha_container' );
function feodoraxis_add_smart_captcha_container( $replace ) {
    $replace .= '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
    return $replace;
}

//Опишем функцию проверки токена
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

/**
 * Проверка токена перед отправкой. Если проверка не пройдет - то сообщение не будет отправлено
 * 
 * @param bool $spam
 */ 
function feodoraxis_smart_captcha_check( $spam ) {

    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $spam = true;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $spam = true;
    }

    return $spam;
}
add_filter( 'wpcf7_spam', 'feodoraxis_smart_captcha_check', 100 );

Установка на стандартную форму регистрации WordPress

Предположим, что на вашем сайте можно зарегистрироваться через стандартную форму. Значит нужно защитить свой сайт от регистрации ботов.

Для начала, как и в первый раз, добавим контейнер для яндекс капчи, в форму регистрации. Добавляем в functions.php такой код:

<?php

define( "CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098" );

//Подключим JS-скрипт яндекс капчи на страницу регистрации
add_action( 'login_footer', 'feodoraxis_enqueue_scripts_admin', 10 );
function feodoraxis_enqueue_scripts_admin() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер в форму регистрации
add_action( 'register_form', 'feodoraxis_add_smart_captcha_registration' );
function feodoraxis_add_smart_captcha_registration() {
    echo '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
}

Если все сделать правильно, то у нас получится такая форма:

Теперь, как и в прошлый раз, при отправке формы, на бекенде нужно проверить, прошел пользователь капчу или нет. Добавим в functions.php следующий код:

<?php
define("SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897");

//Опишем функцию проверки токена - если она уже есть, то повторно ее описать не нужно
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

//Проверим токен перед самой регистрацией
add_filter( 'registration_errors', 'feodoraxis_smart_captcha_register_check' );
function feodoraxis_smart_captcha_register_check( $errors ) {
    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, токен капчи не найден" );
        return $errors;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, мы не уверены, что вы человек :)" );
    }

    return $errors;
}

Отлично! Теперь на нашем сайте не получится зарегистрироваться без прохождения капчи 🙂

Листинг всего кода для защиты формы регистрации:

<?php

define("CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098");
define("SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897");

//Добавим тег defer для подключаемых JS-скриптов
add_filter( 'script_loader_tag', 'add_defer_tag_script', 1, 3 );
function add_defer_tag_script( $tag, $handle, $source ) {
    $path = parse_url( $_SERVER['REQUEST_URI'] );
    if ( strripos( $path['path'], 'wp-admin/' ) ) {
        return $tag;
    }

    return str_replace( "\">", "\" defer>", $tag );
}

//Подключим JS-скрипт яндекс капчи на страницу регистрации
add_action( 'login_footer', 'feodoraxis_enqueue_scripts_admin', 10 );
function feodoraxis_enqueue_scripts_admin() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер в форму регистрации
add_action( 'register_form', 'feodoraxis_add_smart_captcha_registration' );
function feodoraxis_add_smart_captcha_registration() {
    echo '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
}

//Опишем функцию проверки токена
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

//Проверим токен перед самой регистрацией
add_filter( 'registration_errors', 'feodoraxis_smart_captcha_register_check' );

/** @param WP_Error $errors */
function feodoraxis_smart_captcha_register_check( $errors ) {
    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, токен капчи не найден" );
        return $errors;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, мы не уверены, что вы человек :)" );
    }

    return $errors;
}

Защита формы регистрации WooCommerce

Когда сайт работает с WooCommerce — появляется новый путь для регистрации, который тоже нужно защищать. Здесь все также просто как с обычной регистрацией WordPress, так что в детали вдаваться не буду.

Выведем капчу в форме

<?php

define("CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098");

//Добавим тег defer для подключаемых JS-скриптов
add_filter( 'script_loader_tag', 'add_defer_tag_script', 1, 3 );
function add_defer_tag_script( $tag, $handle, $source ) {
    $path = parse_url( $_SERVER['REQUEST_URI'] );
    if ( strripos( $path['path'], 'wp-admin/' ) ) {
        return $tag;
    }

    return str_replace( "\">", "\" defer>", $tag );
}

//Подключим JS-скрипт яндекс капчи
add_action( 'wp_enqueue_scripts', 'feodoraxis_enqueue_scripts', 100 );
function feodoraxis_enqueue_scripts() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер в форму регистрации WooCommerce
add_action( 'woocommerce_register_form_end', 'feodoraxis_add_ya_captcha_container_woocommerce' );
function feodoraxis_add_ya_captcha_container_woocommerce() {
    echo '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
}

Проверим капчу на бекенде при отправке формы

<?php

define( "SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897" );

//Опишем функцию проверки токена - если она уже есть, то повторно ее описать не нужно
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array( $curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

/**
 * Валидация капчи при попытке регистрации WooCommerce
 * 
 * @param WP_Error $validation_error
 */
function feodoraxis_woocommerce_yandex_captcha_check( $validation_error ) {

    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $validation_error->add( 'smart_captcha_validation_fail', 'Валидация не пройдена' );
        return;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $validation_error->add( 'smart_captcha_validation_fail', 'Валидация не пройдена' );
    }

    return $validation_error;
}
add_filter( 'woocommerce_process_registration_errors', 'feodoraxis_woocommerce_yandex_captcha_check', 10 );

Подитог

Теперь вы умеете защищать свои формы от СПАМа с помощью яндекс смарт капчи.

Надеюсь, статья была вам полезна. Если это так — пишите комментарии, подписывайтесь на мои социальные сети и делитесь этой статьёй с друзьями.

Мои социальные сети:

https://t.me/feodoraxis_club

https://vk.com/feodoraxis_club

https://www.youtube.com/@feodoraxis

Желаю вам успехов! 🙂

Листинг всего кода, представленного в статье:

<?php

define( "CLIENT_KEY", "ysc1_YIrsc28ZIwCNtdzCF6WbOax3XTMtHl1S8MZsbrXf30e89098" );
define( "SERVER_KEY", "ysc2_YIrsc28ZIwCNtdzCF6WbijyIbqngEOt0gUnavHEYfdcdc897" );

//Добавим тег defer для подключаемых JS-скриптов
add_filter( 'script_loader_tag', 'add_defer_tag_script', 1, 3 );
function add_defer_tag_script( $tag, $handle, $source ) {
    $path = parse_url( $_SERVER['REQUEST_URI'] );
    if ( strripos( $path['path'], 'wp-admin/' ) ) {
        return $tag;
    }

    return str_replace( "\">", "\" defer>", $tag );
}

//Опишем функцию проверки токена
function token_validate( string $token ):bool {
    $curl = curl_init();
    curl_setopt_array( $curl, [
        CURLOPT_URL => 'https://smartcaptcha.yandexcloud.net/validate?secret=' . SERVER_KEY . '&ip=' . $_SERVER['REMOTE_ADDR'] . '&token=' . $token,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ] );
    $json_validation = curl_exec( $curl );
    curl_close( $curl );
    $response = json_decode( $json_validation, true );

    if ( json_last_error() || $response['status'] !== 'ok' ) {
        return false;
    }

    return true;
}

/**
 * Защита CF7
 */ 

//Подключим JS-скрипт яндекс капчи в публичную часть сайта
add_action( 'wp_enqueue_scripts', 'feodoraxis_enqueue_scripts', 100 );
function feodoraxis_enqueue_scripts() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер во все формы CF7
add_filter( 'wpcf7_form_elements', 'feodoraxis_add_smart_captcha_container' );
function feodoraxis_add_smart_captcha_container( $replace ) {
    $replace .= '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
    return $replace;
}

/**
 * Проверка токена перед отправкой. Если проверка не пройдет - то сообщение не будет отправлено
 * 
 * @param bool $spam
 */ 
function feodoraxis_smart_captcha_check( $spam ) {

    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $spam = true;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $spam = true;
    }

    return $spam;
}
add_filter( 'wpcf7_spam', 'feodoraxis_smart_captcha_check', 100 );


/**
 * Защита регистрации WordPress
 */ 

//Подключим JS-скрипт яндекс капчи на страницу регистрации
add_action( 'login_footer', 'feodoraxis_enqueue_scripts_admin', 10 );
function feodoraxis_enqueue_scripts_admin() {
    wp_enqueue_script( 'ya-smart-captcha', 'https://smartcaptcha.yandexcloud.net/captcha.js', [], '1.0' );
}

//Добавим контейнер в форму регистрации
add_action( 'register_form', 'feodoraxis_add_smart_captcha_registration' );
function feodoraxis_add_smart_captcha_registration() {
    echo '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
}

/**
 * Проверим токен перед самой регистрацией
 *
 * @param WP_Error $errors 
 */
function feodoraxis_smart_captcha_register_check( $errors ) {
    if ( ! isset( $_POST['smart-token'] ) || empty( trim( $_POST['smart-token'] ) ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, токен капчи не найден" );
        return $errors;
    }

    $smart_token = $_POST['smart-token'];
    if ( ! token_validate( $smart_token ) ) {
        $errors->add( "smartCaptcha invalid", "Ошибка, мы не уверены, что вы человек :)" );
    }

    return $errors;
}
add_filter( 'registration_errors', 'feodoraxis_smart_captcha_register_check' );

/**
 * Защита регистрации WooCommerce
 */ 

//Добавим контейнер в форму регистрации WooCommerce
add_action( 'woocommerce_register_form_end', 'feodoraxis_add_ya_captcha_container_woocommerce' );
function feodoraxis_add_ya_captcha_container_woocommerce() {
    echo '<div id="captcha-container" class="smart-captcha" data-sitekey="' . CLIENT_KEY . '" ></div>';
}

/**
 * Валидация капчи при попытке регистрации WooCommerce
 * Добавим ту-же функцию, что и для формы регистрации WordPress
 */ 
add_filter( 'woocommerce_process_registration_errors', 'feodoraxis_smart_captcha_register_check', 10 );