Как бороться со спамом в WordPress?
Сегодня речь пойдёт о такой неприятнейшей вещи как спам в wordpress. Таки да, дрянь это премерзкая и отвратительная. И, что любопытно, практически непобедимая. Да, постоянно изобретаются новые плагины. И спам-боты постоянно совершенствуются, обходя их функционал. В результате спам-бот пробивает защиту, и плагин превращается в груду бесполезного программного кода. Даже могучий Akismet - хвала ему во веки веков - и тот пропускает спамные комментарии, ну либо наоборот, сливает в спам вполне годные. Так что - практика показывает, единственное приемлемое решение, это уникальная собственная реализация защиты от спама. Но - это доступно только программистам, или хотя бы более-менее понимающим основы PHP. Потому как потребуется вносить изменения непосредственно в движок.
Итак, самый простой способ одолеть спам, это переименовать поля формы комментариев совместно с правками в скрипт получения этих самых комментариев. Причем, лично я его опробовал на себе, и могу сказать, что за последние недели две спама в каментах у меня не было, хотя до того - по 15 спамных каментов ежедневно приходило минимум. Всё дело в том, что движок WordPress имеет стандартные имена полей форм. Например в форме комментариев - само текстовое поле называется (id & name) comment. Назовите его как-нибудь вроде comment_anti_spam с соотвествующими правками в файле wp-comments-post.php, который лежит рядом с вашим index.php, и всё - спам-боты будут атаковать поле comment, но не попадут в базу, очередь модерации, и, соответственно, на сайт. При этом само поле comment надо оставить, и заодно проверять ещё и его, заполнено или нет. Дело в том, что это поле скрыто на странице средствами CSS, и живой человек увидеть его не сможет. А роботу всё равно. Итак, допустим, мы решили - делаем так. Что для этого требуется предпринять? Во-первых, отредактировать файл /wp-content/themes/<имя вашей темы>/style.css, добавив в её конец следующий класс:
.invisible {
display:none;
}
Этот класс, к слову, универсален - он позволяет оставить тот или иной элемент непосредственно в коде, но при этом вообще не выводить его на странице.
Затем, редактируем файл /wp-content/themes/<имя вашей темы>/comments.php:
<input class="invisible" type="text" name="author" id="author"
value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
<input class="comment" type="text" name="author_anti_spam" id="asp_author"
value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
По большому счёту, мы просто дублируем поле, одному прописываем класс invisible (тому, которое оригинальное), а другому оставляем класс comment. И переименовываем видимое поле. После чего лезем в корень сайта, и там находим файл wp-comments-post.php, в котором меняем следующее:
$comment_author_spam = ( isset($_POST['author']) ) ?
trim(strip_tags($_POST['author'])) : null;
$comment_author_email_spam = ( isset($_POST['email']) ) ? trim($_POST['email']) : null;
$comment_author_url_spam = ( isset($_POST['url']) ) ? trim($_POST['url']) : null;
$comment_content_spam = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;
if ( !empty($comment_author_spam) || !empty($comment_author_email_spam) ||
!empty($comment_author_url_spam) || !empty($comment_content_spam) )
{
die('Ай ай ай. Спамить не есть гут!');
exit;
}
$comment_author = ( isset($_POST['author_anti_spam']) ) ?
trim(strip_tags($_POST['asp_author'])) : null;
$comment_author_email = ( isset($_POST['email_anti_spam']) ) ? trim($_POST['asp_email']) : null;
$comment_author_url = ( isset($_POST['url_anti_spam']) ) ? trim($_POST['asp_url']) : null;
$comment_content = ( isset($_POST['comment_anti_spam']) ) ? trim($_POST['asp_comment']) : null;
Тащемта, после этого всё будет работать как часы. Если только у вас не очень высокопосещаемый блог, и спамеры не будут править алгоритм конкретно под вас. Кстати в следующей статье на эту тему есть планы описать принципы борьбы со спамом в wordpress, и почему плагины предназначенные для такой борьбы - рано или поздно вырождаются, т.е. начинают пропускать спам на сайт.