Защита от спама в 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.

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

Комментарии (всего 18 комментариев)

Написать комментарий

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

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

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


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