Навсегда защищаемся от спама в WordPress
Всем привет. Если у вас есть сайт на WordPress, то вам должна быть знакома проблема заполонения своего сайта спам комментариями. Конечно, со спамом в WordPress отлично справляется плагин Akismet, который по умолчанию там установлен, но проблема этого плагина в том, что он частенько помечает как спам вполне человечные комментарии от реальных людей.
До недавнего времени я постоянно проверял папку со спамом на наличие ошибочно попавших туда комментариев. Обычно в день у меня на блоге в спам попадало около 50-70 комментариев. В конце концов меня это утомило, и я начал искать способ, который бы позволил мне избавиться от автоматического спама раз и навсегда. И я такой способ нашел 🙂 .
Идея с капчей, которая могла бы немного выправить ситуацию, меня вообще не устраивала. Я думаю, что сегодня на блогах уже редко где встретишь капчу, она уходит в прошлое, и это правильно. Как-то я уже писал о том, что использование капчи на блоге отпугивает большинство комментаторов, а использование жуткой цифровой капчи полностью убивает желание комментировать.
После недолгих поисков, я нашел интересный и простой способ защиты от спама, который заключается в подмене текстовых полей, вот о нем я и хочу рассказать.
Суть этого способа в том, что мы создаем новое поле для комментария с новым именем, а старое поле спрячем от глаз посетителей. Спам-бот, по привычке, будет вводить комментарий в стандартное поле, так как настроен на это, но отправить этот комментарий он не сможет 🙂 . В то же время обычные посетители будут вводить комментарии в форму с новым именем, и при этом никаких изменений они даже не заметят.
Итак, перейдем к реализации этого метода. Существует два пути развития событий: либо у вас старая версия движка, и комментарии у вас выводятся через html код, либо у вас свежая версия, и комментарии выводятся через функцию comment_form().
Первый вариант
Рассмотрим вариант, когда комментарии выводятся через html код.
Первое, что нам нужно сделать, это найти в файле comments.php, в папке с темой оформления, строку, отвечающую за вывод поля для ввода комментария. Обычно оно выглядит так:
<textarea id="comment" class="textarea" name="comment"></textarea>
Эту строчку нужно заменить на следующую конструкцию:
<div class="spamform"> <textarea id="comment" class="textarea" name="comment"></textarea> </div> <textarea id="newcomment" class="textarea" name="newcomment"></textarea>
Следующим шагом нам нужно изменить стили для этих форм. Для того, чтобы скрыть старую форму от глаз посетителей, добавляем в файл style.css:
.spamform {display: none;}
Если к вашей старой форме комментариев были привязаны стили, то вам нужно заменить в style.css все id=»comment» на id=»newcomment», тогда ваша новая форма комментариев будет выглядеть как прежняя.
Ну и последним шагом вставляем в конец файла functions.php (до знака ?>) следующую функцию:
//spam_detect add_filter('pre_comment_on_post', 'verify_spam'); function verify_spam($commentdata) { $spam_test_field = trim($_POST['comment']); if(<strong>!</strong>empty($spam_test_field)) wp_die('no-spam'); $comment_content = trim($_POST['newcomment']); $_POST['comment'] = $comment_content; return $commentdata; } //end
Второй вариант
Теперь рассмотрим второй вариант, когда комментарии выводятся при помощи функции comment_form ().
Здесь алгоритм практически такой же как и в предыдущем пункте. Все, что нам нужно сделать, это добавить две функции в файл function.php:
//Добавляем поле комментария add_filter('comment_form_defaults', 'change_comment_form_defaults'); function change_comment_form_defaults($default) { $commenter = wp_get_current_commenter(); $default['comment_notes_after'] <strong>.</strong>= '<p class="comment-form-real-comment"> <textarea id="newcomment" aria-required="true" name="newcomment"></textarea> </p>'; return $default; } //end //spam_detect add_filter('pre_comment_on_post', 'verify_spam'); function verify_spam($commentdata) { $spam_test_field = trim($_POST['comment']); if(<strong>!</strong>empty($spam_test_field)) wp_die('no-spam'); $comment_content = trim($_POST['newcomment']); $_POST['comment'] = $comment_content; return $commentdata; } //end
Первая функция добавляет новое поле для комментирования (аналог <textarea> в предыдущем пункте), а вторая функция проверяет, в какое поле был введен комментарий.
Все, что осталось сделать, это закрыть старое поле от глаз посетителей. Для этого вставляем в файл style.css следующую строчку:
.comment-form-comment {display: none;}
Опять же, для того, чтобы ваша новая форма комментариев выглядела как и прежняя, вам нужно в style.css изменить все id=»comment» на id=»newcomment».
После того, как я сделал подмену полей, у меня на блоге пока не появилось ни одного спам комментария. Думаю, если и найдется какой-нибудь спамер, который напишет комментарий вручную, то Akismet его легко вычислит 🙂 .
Akismet сам по себе делает подмену .Боты умные пошли слишком, в последнее время, за месяц более ста коментов кидают в спам
блин перепутал его с антиспам би.
У меня акисмет стоит, да он частенько хорошие комментарии отправляет в спам, видимо надо его заменять. Спасибо за статью.
спасибо за способ, давно слышал о нем, но никак руки не доходили поставить