Пишем плагин ReCaptcha v2 для комментариев WordPress

Если нет желания учиться создавать свой плагин рекаптчи, можно воспользоваться готовым приложением «Invisible reCaptcha для WordPress «, которое так же добавляет капчту к плагину CF7.
Прежде чем писать свой плагин, нужно получить «ключ сайта», и «Секретный ключ» в админ.панели Google. Переходим по ссылке «https://www.google.com/recaptcha/admin», и добавляем новый сайт, выбрав опцию «Флажок. Я не робот».
В системе WordPress для работы с комментариями существуют фильтры, и хуки, которые помогут в разработке плагина.
Первый фильтр preprocess_comment, который срабатывает после нажатия кнопки добавить комментарий. Здесь же происходят различные проверки, в том числе и проверка на поле «Комментарий».
add_filter('preprocess_comment', 'call_back_function');
И второй фильтр comment_form_default_fields, который срабатывает после создания полей.
Т.е с его помощью мы можем добавить новые или удалить текущие поля в форме добавления комментариев.
add_action('comment_form_default_fields','call_back_function');
Срзу хочу предупредить, что данный фильтр будет работать исключительно для не авторизованных пользователей, если вы авторизуетесь, то картинка с каптчей отображаться не будет.
И лучше будет воспользоваться хуком comment_form, если конечно у вас есть регистрация на сайте. В самом низу статьи будет дополнительный материал на эту тему.
add_action('comment_form','call_back_function');
Теперь перейдём к созданию плагина, для этого создаём папку /wp-content/plugins/ivacms_recaptcha/. В этой папке создадим файл ivacms_recaptcha.php, и разместим нижний код, чтобы активировать плагин.
<?php /* Plugin Name: Рекаптча для комментариев Author: Иванов Алексей Author Uri: http://ivacms.ru */
Теперь в этом же файле создаём два объекта с ключом сайта, и секретным кодом из админ.панели ReCaptcha.
class ivacms_recaptcha{ private $site_key='ключ сайта'; private $secret_key='секретный ключ'; }
В констркуторе мы подгрузим всего один фильтр и метод Load , в которой будут загружаться основные функции нашего плагина после инициализации WordPress.
public function __construct(){ add_action('wp_loaded',array($this,'load')); }
В самом же методе LOAD будем использовать один хук и два фильтра. А так же добавим callback функции и выполним проверку.
public function load(){ if((string)$this->site_key !='' and (string)$this->secret_key !=''){ add_action('wp_head',array($this,'add_api_recaptcha')); add_filter('preprocess_comment', array($this,'check_recaptcha')); add_filter('comment_form_default_fields', array($this,'add_html_recaptcha') ); } }
По поводу проверок:
1. Так как форма добавления комментария расположена исключительно на страницах самого поста, нам нужно сделать проверку с помощью функции is_single, ну чтобы js скрипт не загружался на всех страницах без исключения, а только внутри страницы или записи.
Но есть одна проблема функции типа is_single или is_page начинают работать только после загрузки хука template_redirect, поэтому данную проверку мы сделаем внутри метода add_api_recaptcha.
Это очень важный момент, так как многие программисты не задумываясь подключают js и css файлы везде где только возможно.
2. Если секретный ключ и ключа сайта не заполнены, не подключать функции на сайте.
С помощью хука wp_head и метода add_api_recaptcha мы подключаем в header сайта библиотеку для работы с recaptcha.
add_action('wp_head',array($this,'add_api_recaptcha'));
Для добавления спец. кода отображения самой каптчи на сайте используем хук comment_form_default_fields.
add_action('comment_form_default_fields',array($this,'add_html_recaptcha'));
Для проверки капчти на стороне сервера используем фильтр preprocess_comment
add_filter('preprocess_comment',array($this,'check_recaptcha'));
Что имеем?
<?php /* Plugin Name: Рекаптча для комментариев Description: Данный плагин добавляет каптчу (Google ReCaptcha v2) от компании Google в форму добавления комментариев. Author: Иванов Алексей Author Uri: http://ivacms.ru */ class ivacms_recaptcha{ private $site_key='ключ сайта'; private $secret_key='секретный ключ'; public function __construct(){ add_action('wp_loaded',array($this,'load')); } public function load(){ if((string)$this->site_key !='' and (string)$this->secret_key !=''){ add_action('wp_head',array($this,'add_api_recaptcha')); add_filter('preprocess_comment', array($this,'check_recaptcha')); add_filter( 'comment_form_default_fields', array($this,'add_html_recaptcha') ); } }
Ну а теперь будем разрабатывать сами функции. Начнём с подключения js скрипта api библиотеки google.
private function add_api_recaptcha(){ if(is_single() or is_page()){ wp_enqueue_script('ivacms_recaptcha','https://www.google.com/recaptcha/api.js'); } }
Чтобы в форме добавления комментария появилась ReCaptcha, необходимо заполнить объекты $site_key и $secret_key, а так же добавить google html элемент.
public function add_html_recaptcha($fields){ $fields['recaptcha']='<div class="g-recaptcha" data-sitekey="'.$this->site_key.'"></div>'; return $fields; }
Если секретный ключ или ключ сайта, указан неправильно, мы увидим следующую ошибку
Если всё сделано правильно, капчта прикреплена к форме
А теперь нам нужно создать функцию, которая получит код рекаптчи и отправит её на Google сервер для проверки. Ключ рекаптчи хранится в post переменной $_POST[‘g-recaptcha-response’].
Данное поле не отображается для обычного пользователя, но с помощью инструментов разработчика, мы можем посмотреть, что она действительно есть в форме.
Сама же верификация проходит по URL _https://www.google.com/recaptcha/api/siteverify, попробуйте перейти по этому адресу, и мы увидим, что верификация не пройдена, о чём говорит параметр success.
По этому URL мы должны отправить три параметра:
- Секретный ключ, который передаётся в get переменной secret
- Ip адрес комментатора, который передаётся в remoteip
- Зашифрованный код рекаптчи, который нужно передать в параметре response
Ответ от google мы получим в формате Json, поэтому вызовем функцию json_decode, чтобы преобразовать ответ в массив array().
public function check_recaptcha($data){ $ip=$_SERVER['REMOTE_ADDR']; $captcha=$_POST['g-recaptcha-response']; $params="secret=".$this->secret_key."&remoteip=$ip&response=$captcha"; $result = file_get_contents("https://www.google.com/recaptcha/api/siteverify?".$params, false); $captcha=json_decode($result, true); if($captcha['success']==0){ $text='Роботы не могут оставлять комментарии'; wp_die($text); } return $data; }
Если значение переменной success равно «0», то по всей видимости комментарий хочет добавить какой-нибудь «бот», но мы даём ему пинка под зад, и завершаем отправку комментария с ошибкой.
На этом разработка плагина практически завершена, ведь нужно вызвать разработанный класс
new ivacms_wp_recaptcha;
А теперь собираем весь код в один:
<?php /* Plugin Name: Рекаптча для комментариев постов Description: Данный плагин добавляет каптчу (Google ReCaptcha v2) от компании Google в форму добавления комментариев. Author: Иванов Алексей Author Uri: http://ivacms.ru */ class ivacms_recaptcha{ private $site_key=''; private $secret_key=''; public function __construct(){ add_action('init',array($this,'load')); } public function load(){ if((string)$this->site_key !='' and (string)$this->secret_key !=''){ add_action('wp_head',array($this,'add_api_recaptcha')); add_filter('preprocess_comment', array($this,'check_recaptcha')); add_filter( 'comment_form_default_fields', array($this,'add_html_recaptcha') ); if(is_user_logged_in()){ add_action( 'comment_form', array($this,'add_html_recaptcha_logged') ); }else{ add_filter( 'comment_form_default_fields', array($this,'add_html_recaptcha') ); } } } public function add_html_recaptcha($fields){ $fields['recaptcha']='<div class="g-recaptcha" data-sitekey="'.$this->site_key.'"></div>'; return $fields; } public function add_html_recaptcha_logged($post_id){ echo '<div class="g-recaptcha" data-sitekey="'.$this->site_key.'"></div>'; } public function add_api_recaptcha(){ if(is_single() or is_page()){ wp_enqueue_script('ivacms_recaptcha','https://www.google.com/recaptcha/api.js'); } } public function check_recaptcha($data){ $ip=$_SERVER['REMOTE_ADDR']; $captcha=$_POST['g-recaptcha-response']; $params="secret=".$this->secret_key."&remoteip=$ip&response=$captcha"; $result = file_get_contents("https://www.google.com/recaptcha/api/siteverify?".$params, false); $captcha=json_decode($result, true); if($captcha['success']==0){ $text='Роботы не могут оставлять комментарии'; wp_die($text); } return $data; } } new ivacms_recaptcha;
А вот теперь можно наслаждаться своей разработкой, и сказать НЕТ надоедливым ботам. Что же касается авторизованных пользователей, если на сайте есть или будет регистрация, то скрипт нужно не много переделать.
Как это сделать я написал в самом начале статьи, но для тех кому лень что либо изобретать, то заменим одну строку в методе Load.
add_filter( 'comment_form_default_fields', array($this,'add_html_recaptcha') );
НА
if(is_user_logged_in()){ add_action( 'comment_form', array($this,'add_html_recaptcha_logged') ); }else{ add_filter( 'comment_form_default_fields', array($this,'add_html_recaptcha') ); }
И Добавим в class ещё один метод.
function add_html_recaptcha_logged($post_id){ echo '<div class="g-recaptcha" data-sitekey="'.$this->site_key.'"></div>'; }
Ну и конечно данный плагин можно скачать по кнопке ниже. Я не стал в плагине создавать настройки с полями для ключей, для тех кто хорош знаком с WordPress без проблем решит данную задачу. Так же в готовом плагине есть проверка для авторизованных пользователей.