Защита от спама в WordPress без плагинов
Почти 3 года назад я опубликовал статью о "защите от спама" путем подмены полей. Этот метод и сейчас работает идеально, Akismet вылавливает лишь штук 5 ручных спамных комментариев в месяц, а весь автоматический спам не доходит до него вовсе. Я до сих пор удивляюсь, когда захожу в админку какого-нибудь клиентского блога и вижу там тысячи комментов, помеченных как спам. Как среди такой горы мусора можно найти комментарий, который попал в спам по ошибке? Единственное неудобство моего метода подмены полей заключается в необходимости править файлы движка. Пока блог один довольно легко применять хак при каждой новой версии WordPress, но когда блогов становится больше десятка в очередной раз править файлы движка надоедает. Поэтому мне пришлось модернизировать метод защиты от спама, избавившись от необходимости править какие-либо файлы самого движка.
Метод подмены полей заключается в том, что мы скрываем настоящее поле для ввода комментария 'comment' и подсовываем вместо него новое поле 'real-comment'. Для посетителей блога все останется, как прежде и они не заметят никакой разницы, а вот спам-скрипты будут пытаться заполнить стандартное поле ввода комментария со стандартным его именем 'comment'. Ведь скрипт не понимает, что человек не может заполнить текстовое поле, которое он не видит на странице. Спамный комментарий определяется именно по заполненности невидимого для посетителей поля.
Начнем с того, что добавим настоящее поле для ввода комментария. Здесь возможны два разных варианта:
1. Если у вас комментарии выводятся не через функцию comment_form() (она была введена в WordPress 3.0 и предназначена для полной замены формы комментария). В этом случае откройте файл comments.php вашего шаблона и найдите там код, выводящий поле для ввода комментария. Что-то похожее на:
<textarea id="comment" class="textarea" name="comment"></textarea>
Поменяйте его на код:
<div class="smo"> <textarea id="comment" class="textarea" name="comment"></textarea> </div> <textarea id="real-comment" class="textarea" name="real-comment"> </textarea>
Теперь надо скрыть стандартное поле для ввода комментария. Для этого откройте файл стилей вашего шаблона style.css и добавьте туда код:
.smo {position: absolute; left: -1000px;}
Можно использовать "display: none;", но это не принципиально.
2. Теперь о том, как добавить настоящее поле для ввода комментария, если ваш шаблон использует для вывода формы комментирования новую функцию comment_form(). Откройте файл шаблона functions.php и добавьте туда код:
//добавление своего поля для ввода комментария start add_filter('comment_form_defaults', 'change_comment_form_defaults'); function change_comment_form_defaults($default) { $commenter = wp_get_current_commenter(); $default['comment_notes_after'] .= '<p class="comment-form-real-comment"> <label for="real-comment">Комментарий</label><textarea id="real-comment" aria-required="true" rows="8" cols="45" name="real-comment"></textarea> </p>'; return $default; } //добавление своего поля для ввода комментария end
Скрыть стандартное поле надо путем вставки в style.css кода:
.comment-form-comment {display: none;}
Первая чаcть хака подмены полей готова. У нас теперь есть видимое поле для ввода комментария 'real-comment' (можно использовать другое имя), а стандартное поле скрыто с глаз посетителей. Теперь нам надо определить, какое из полей было заполнено комментатором - если видимое, то комментарий пропускаем, а если невидимое, то запрещаем его публикацию. Откройте файл functions.php вашего шаблона и добавьте туда код:
//проверка на спам start add_filter('pre_comment_on_post', 'verify_spam'); function verify_spam($commentdata) { $spam_test_field = trim($_POST['comment']); if(!empty($spam_test_field)) wp_die('Спаму нет!'); $comment_content = trim($_POST['real-comment']); $_POST['comment'] = $comment_content; return $commentdata; } //проверка на спам end
На этом все, больше автоматический спам вас не побеспокоит. Проверить работу данного хака очень легко - достаточно удалить сделанные вами изменения в файле style.css, обновить страницу, заполнить оба поля для ввода комментария и попытаться опубликовать ваш комментарий.
Данный хак хорош по двум причинам: абсолютно никакого спама и при этом нет необходимости обновлять хак при выходе новых версий WordPress.
Рекомендую также:

#31, 22 января, 2012 в 19:59
разобрался, написал
.smo {display: none;}
#32, 30 января, 2012 в 20:52
Теперь все время пишет - Извините, обсуждение этой записи закрыто. ((((
Версия WP - 3.2.1.
В чем проблема?
#33, 5 февраля, 2012 в 22:35
Давно искал решение проблемы со спамом без использования плагинов.Они так увеличивают нагрузку и снижают скорость загрузки.Пора приниматься за реализацию.Спасибо.
#34, 12 февраля, 2012 в 22:28
Отлично! Все работает! Спасибо.
#35, 16 февраля, 2012 в 23:47
Огромное спасибо, получилось не сразу, но теперь работает как надо!