Защита от спама в WordPress без плагинов

Защита от спама в WordPress без плагинов

Почти 9 лет назад я опубликовал статью о "защите от спама" путем подмены полей. Этот метод и сейчас работает идеально, Akismet вылавливает лишь штук 5 ручных спамных комментариев в месяц, а весь автоматический спам не доходит до него вовсе. Я до сих пор удивляюсь, когда захожу в админку какого-нибудь клиентского сайта и вижу там тысячи спамных комментов. Как среди такой горы мусора можно найти комментарий, который попал в спам по ошибке? В данной обновленной версии этого хака больше не требуется править файлы движка – один раз настроили и больше ничего делать не надо.

Метод подмены полей заключается в том, что мы скрываем настоящее поле для ввода комментария 'comment' и подсовываем вместо него новое поле 'real-comment'. Для посетителей блога все останется, как прежде и они не заметят никакой разницы, а вот спам-скрипты будут пытаться заполнить стандартное поле ввода комментария со стандартным его именем 'comment'. Ведь скрипт не понимает, что человек не может заполнить текстовое поле, которое он не видит на странице. Спамный комментарий определяется именно по заполненности невидимого для нормальных посетителей поля.

По пунктам:

1 Добавляем в форму комментирования свое собственное поле 'real-comment'. Для этого откройте файл темы functions.php и добавьте туда код:

//добавляем поле 'real-comment' start
function wph_add_new_comment_field($args) {
 
    if (preg_match('/<textarea.*textarea>/', $args['comment_field'], $match)){
        $textarea = $match[0];
        $real_textarea = str_replace('comment', 'real-comment', $textarea, $count);
 
        if ($count) {
            $hidden_textarea = str_replace( '<textarea', 
            '<textarea style="display:none;"', $textarea );
            $args['comment_field'] = str_replace($textarea, 
            "$hidden_textarea$real_textarea", $args['comment_field']);
        }
    }
    return $args;
}
add_filter('comment_form_defaults', 'wph_add_new_comment_field', 30);
//добавляем поле 'real-comment' end

Теперь на странице добавления комментариев у вас будет 2 одинаковых поля для ввода комментария с разными именами, причем стандартное поле 'comment' скрыто от глаз посетителей и они его заполнить никак не могут.

2 Теперь встроим проверку на заполненность стандартного поля 'comment'. Для этого откройте файл темы functions.php и добавьте туда код:

//проверка на спам start 
function wph_verify_spam() {
    if(false === strpos($_SERVER['REQUEST_URI'], 'wp-comments-post.php'))
        return; 
    if(!empty($_POST['comment']))
        wp_die('Спаму нет!');
 
    $_POST['comment'] = $_POST['real-comment'];
}
add_filter('init', 'wph_verify_spam');
//проверка на спам end

На этом все, больше автоматический спам вас не побеспокоит. Проверить работу данного хака очень легко – достаточно в первом коде убрать 'display:none;', обновить страницу, заполнить оба поля для ввода комментария и попытаться опубликовать ваш комментарий.

Данный хак хорош по двум причинам: абсолютно никакого спама и при этом нет необходимости обновлять хак при выходе новых версий WordPress.

PS. Это обновленная версия хака, которая будет работать на WordPress версии 4.4 и выше (никаких проблем с плагинами вроде WooCommerce и прочими). За подсказку с новым кодом большое спасибо Тимуру Камаеву.

Понравился пост? Подпишись на обновления по Обновления блога по RSSRSS или Обновления блога на TwitterTwitter !

Комментарии (всего 167 комментариев)
Написать комментарий

(обязательно)

(обязательно, не публикуется)

Для вставки кода используйте кнопку "Код", по умолчанию используется синтаксис подсветки языка "php", вы можете поменять его на любой другой поддерживаемый GeSHi язык, например "javascript", "css", "html4strict", "sql" и тд. Используйте предпросмотр!
 


Подписаться на уведомления без комментирования.