SEO, заработок в Интернете, блоггинг, работа в компьютерных программах

Раз и навсегда избавляемся от спама в комментариях WordPress без плагинов

Спам в комметарияхДумаю, проблема спама в комментариях WordPress знакома многим. Предлагаю метод, который поможет раз и навсегда избавиться от спама в комменты на движке WordPress. Причём мы не будем устанавливать никаких плагинов, а значит сохраним ресурсы сервера, они нам ещё пригодятся. К тому же данную операцию придётся выполнить только один раз и после этого можно будет смело забыть о том что такое спам на WordPress. Навсегда. Я использую данный метод давно и он никогда ещё меня не подводил. Это работает куда эффективнее любых плагинов типа Akismet и пр.

иконкаСуть метода состоит в скрытии стандартной формы для ввода комментариев, вместо неё пользователь будет видеть новую форму комментирования (точно такую же на вид, мы её добавим сами) и комментарии будут приниматься только с этой новой формы. В то время как роботы будут по-прежнему заполнять стандартную форму комментирования, которая попросту будет отключена. На самом деле тут всё очень просто и вы сейчас это поймёте.

Для начала нам нужно создать новую форму комментирования (копию стандартной). Тут возможны два варианта. Дело в том, что в более старых темах WordPress для вывода комментариев используется функция «textarea», а в новых – функция «comment_form».

Чтобы проверить какая функция у вас, откройте файл comments.php вашей темы и найдите там примерно такую запись

<textarea id="comment" class="textarea" name="comment"></textarea>

Например, у меня в этом шаблоне запись выглядит так

<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></p>

Основной признак – начало функции: «<textarea...»

Можно воспользоваться поиском (Ctrl+F) по слову «textarea» в файле comments.php или просто найти её визуально, благо файл небольшой. Если подобная запись присутствует, значит у вас старая функция и вы делаете всё как написано в пункте 1 ниже. Если такой строчки нет, значит у вас новая функция и вы делаете всё по пункту 2. Пункт 3 обязателен для выполнения в обоих случаях.

1*. Итак, у вас старая функция. Меняем в файле comments.php код

<p><textarea id="comment" class="textarea" name="comment"></textarea></p>

На такой

<div class="comm">
  <textarea id="comment" class="textarea" name="comment"></textarea>
</div>
<p><textarea id="real-comment" class="textarea" name="real-comment"></textarea></p>

То есть стандартной форме комментирования мы присвоили класс «comm» и обернули её в <div>, а также добавили новую форму «real-comment», взяв за основу стандартную форму, но при этом изменили в ней name и id с «comment» на «real-comment».

При этом используем код функции своего шаблона, к примеру, если у меня в шаблоне изначально код функции вывода комментов был такой

<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></p>

Я заменил его на такую конструкцию

<div class="comm">
  <textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea>
</div>
<p><textarea name="real-comment" id="real-comment" cols="100%" rows="10" tabindex="4"></textarea></p>

Если вы всё сделали правильно, то теперь у вас под каждым постом должно выводится две одинаковые формы комментирования. Пришёл черёд скрыть стандартную форму комментирования от пользователей. Именно для этого мы присвоили ей класс «comm» (кстати, вы можете обозвать этот класс по-своему).

Открываем файл style.css нашей темы и дописываем в нём стиль для класса «comm»

.comm {position: absolute; left: -1000px;}

либо такой вариант

.comm {display: none;}

На ваш выбор. Первый вариант смещает форму на 1000 пикселей влево и она становится не видна, второй просто запрещает её показ. Просмотрите свой сайт в браузере IE и выберите тот вариант стиля, который корректно убирает вторую форму комментариев со страницы (с остальными браузерами никаких проблем быть не должно).

Теперь стандартная форма комментариев скрыта от пользователей (но не от ботов). Однако это ещё не всё. Теперь вам нужно выполнить пункт 3.

2*. В вашем шаблоне используется новая функция «comment_form». Если в вашей теме WP для вывода комментов используется новая функция «comment_form», действуем следующим образом: открываем файл functions.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'] .=
  '<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;
}
//добавляем новую форму ввода комментария конец кода

 Затем скрываем стандартную форму комментариев, дописав в style.css

.comment-form-comment {display: none;}

Переходим к выполнению пункта 3.

3*. Включаем в работу новую форму и отключаем стандартную. Что мы имеем на данный момент: у нас теперь 2 формы комментариев на сайте, причём стандартная форма скрыта от посетителей. Соответственно посетители будут заполнять только ту форму, которую они видят, а именно новую форму, добавленную нами. Теперь прописываем правило, согласно которому комментарии из стандартной формы комментирования (которую будут заполнять боты) станут попросту игнорироваться. А комментарии из новой формы будут проходить проверку.

Открываем файл functions.php нашего шаблона и дописываем в нём

//спам контроль начало

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;
}
//спам контроль конец

Вот и всё. Про спам мы больше не вспоминаем. Если есть вопросы – прошу в комменты. Если вопросов нет – отлично.

P.S. Перед внесением изменений в движок сайта, а так же время от времени не забывайте бэкапить БД и делать полные резервные копии сайта.

Подписка на новые статьи. Введите e-mail:

Понравилась статья? Следи за новостями блога по Лента RSS RSS или в Обновления блога на Twitter Twitter !
Вернуться на Главную страницу
Комментарии (55)
  1. Александр

    Все сделал по вашему совету. Получилось только форма для ввода текста теперь разъехалась на всю ширину шаблона. Как это исправить?

  2. Антон

    Вижу у вас форму ввода текста нормального размера, если вы про тот сайт что в подписи. Как я понял у вас старая функция, то есть вам нужно выполнить шаги 1 и 3, используя свой код textarea.

  3. Александр

    А в каком браузере вы смотрите. У меня стоит хром и окно для ввода текста растянуто на всю ширину шаблона. Как это можно исправить?

  4. Антон

    У вас так было с самого начала или это произошло после действий по подмене формы комментариев на новую? Если второе, то вы что то сделали не так.

  5. Александр

    Вообще так стало после подмены. Я ка только сделал первый шаг и появилось два окна для текста — они сразу вытянулись на всю ширину шаблона. В чем может быть причина и как поправить?

  6. Антон

    Александр, смотрю вы уже исправили самостоятельно изменив cols="100%" на cols="55%". Что ж, тоже вариант.

  7. Евгений

    какой классный и в то же время простой метод! респект!

    просто подменить форму... мне нравится!

  8. Антон

    Евгений, метод действительно простой и отлично работающий. Ещё один его плюс в том что выполнить эти действия придётся только один раз. Ни при обновлении движка и других моментах повторять процедуру не требуется.

  9. Владимир

    Кто пробовал? Методика действительно рабочая?

  10. Антон

    Владимир, вполне. Использовал этот метод на массе сайтов. Да и не только я видимо. Я не пишу тут о том, что не работает. А если и пишу, то предупреждаю что не проверял.

  11. Ольга

    А можно таким образом отсеить спам регистрацию?

    очень актуально!

  12. Антон

    Ольга, никогда не работал с регистрацией.

  13. Ольга

    Ваш код для комментариев у меня работает на отлично.

    Я пыталась сделать для регистрации, как написана в этой статье _http://acid.name/?p=1027 Но там автор, действительно, что-то напутал.

    Пыталась объединить его метод и ваш, но что-то не выходит.

  14. Антон

    Ольга, не могу сказать в чём дело. Может автор статьи напутал, либо метод нуждается в доработке именно под ваш шаблон, не знаю.

  15. Алексанлр

    Вставил как написано по пунктам 2 и 3 . Форма не отображаеться ваша, моя не пропадает. Комментарии все сливаются (пишет «спам»). И все комментарии в вордпрессе не появляются.

    Может вы поподробнее опишите где именно вставляються в эти файлы ваши куски... я ставил все в конце файлов и ничего.

  16. Антон

    Не имею понятия в чём проблема.

  17. Devvver

    Одна проблема — на одном блоге пытался поставить, у меня несколько плагинов работают с выводом комментариев и формы. пришлось везде все править.

  18. Антон

    Devvver, ну а что делать, приходится иногда повозиться.

  19. Сергей Стеклов

    Все работает, спасибо! Теперь еще одним плагином меньше. Раньше я использовал этот Akismet и плюс неплохой плагин WP Ban. Теперь можно удалять Akismet.

    У меня только первый код находился не в comment.php, а в comment-template

  20. Антон

    Ну и отлично.

  21. Дмитрий

    Добрый день! У меня wordpress 3.5.1 В шаблоне comments.php используется функция «comment_form».

    Следуя пункту 2, вставляю тупо кусок Вашего кода после закрывающей скобки comment_form, обновляюсь — ничего не выводится. Насколько я понял, должна выводится вторая форма комментов).

  22. Антон

    Должна. Обновите кэш в браузере и кэширующих плагинах wordpress если есть.

  23. Дмитрий

    Все работает, читайте внимательней статью. Антон, как поставить разделительную черту как у Вас между датой и временем: 17.04.2013 | 16:54 Спасибо.

  24. Антон

    я её не ставил, так и было. в functions.php —

    <div class="comment-meta commentmetadata c_date "><?php echo get_comment_date() . ' | ' . get_comment_time(); ?> <?php edit_comment_link(__('(Edit)'),' ','') ?></div>

  25. RomanZmeu

    Спасибо. Пригодилось для моего блога

  26. Александр

    Проверим, работает ли...

  27. Иван

    Классный способ. Молодца :) Я сам не люблю, когда по каждому чиху надо плагин ставить. А тут всё чётко и понятно. Чуток код подправил и ништяк.

    Так держать, Антоха!

  28. Марина

    Большое спасибо!

  29. Юлия

    Спасибо большое за такой полезный урок! Меня спам комментарии просто убивали — до 100 штук в день, теперь, надеюсь всё будет ок:)

    Только вот я не совсем пойму, но раз комментарии всё равно будут роботы писать на старую форму, которая не отображается, куда они будут деваться? Или нет формы — нечего спамить?

    (Наверное, глупый вопрос, но в технических вопросах я не сильна))

  30. Антон

    Юлия, форма не рабочая и потому заполняться не будет.

  31. Юлия

    У меня каким-то образом она осталась, наверное, рабочей или мои спамеры — ну суперкрутые спамерщики — утром появилось 8 новых спам-комментариев(((

  32. Антон

    Юлия, делайте как написано в статье и всё будет норм. Стандартную форму мы отключили в functions.php.

  33. Эмиль

    Сделал всё как написано, второй и третий пункты. Старая форма поменялась на новую, но стала не рабочей кнопка «Оставить комментарий». Тема Sahifa.

  34. Антон

    Эмиль, если всё сделали правильно то надо смотреть шаблон.

  35. Юлия

    У меня тоже так и не получилось, хотя всё сделала как надо (я доставила плагин с невидимой капчей и теперь всё ок)

  36. Антон

    Юлия, значит тоже какой то конфликт с темой. Надо смотреть код. Обратитесь к фрилансерам, думаю за 3$ и три минуты времени вам решат вопрос. Ну или пользуйтесь плагином.

  37. Rod O'Sheen

    Долго мучился со спамом, от капчи и аксимета толку практически никакого. Пару дней назад воспользовался этим методом — до сих пор нарадоваться не могу. Большое спасибо.

  38. Антон

    Rod, не за что.

  39. aleksandr

    C некоторых пор на сайте в браузере выводятся битые аватары анонимных комментаторов, в админке отображаются правильно. В чем причина не подскажите?

  40. Антон

    aleksandr, разве у анонимных комментаторов есть аватары? на то они и анонимные. скриншот проблемы в студию пожалуйста.

    и почистите кеш браузера.

  41. aleksandr

    Спасибо за внимание, проблему уже решил, изменив код функции вывода аватара по умолчанию.

  42. Антон

    Ну вот и отлично. Многие шаблоны требуют индивидуального подхода, вы молодец что разбираетесь в коде.

  43. Кеша Аксенов

    Добрый день,

    когда вставляю самый первый код, форма комментариев вообще пропадает, ни Вашей , ни моей?

    у меня вот такой код: 'comment_field' => '',

    Может я нашел не то?

    Подскажите.

    Спасибо

  44. Антон

    значит что то неправильно сделал. в статье всё объясняется подробно. читайте внимательно и делайте как написано. на некоторых темах может не работать (редко).

  45. Ксения

    Спасибо!)

    Особенности в моем случае: в файле comment.php была два поля с textarea. Пришлось заменять оба, иначе не появлялись два поля. Остальное прошло так же.

    Из минусов — съехал правый сайдбар вниз. Буду испралять)

  46. Антон

    Ксения, положение комментариев можно регулировать.

  47. Ксения

    Можно) Но «чайникам» этого лучше не делать 😉 Я убрала код функции своего шаблона и все встало на место. Разницы не заметила.

  48. Антон

    Молодец.

  49. Ксения

    К сожалению, мои роботы-спамщики обошли защиту( 95 спам комментариев за ночь((

  50. Антон

    Значит вы что то не так сделали. Если спам проходит значит не отключили стандартную форму в functions.php. А уж вывели ли новую я не знаю.

  51. Ксения

    Таки да... functions.php коряво заливался. Буду смотреть, вроде файл уже нужный лежит. Спасибо!

  52. Виктор

    Отличная статья. Уже второй раз применяю данный метод на своих сайтах.

  53. Антон

    метод эсклюзивный. если ещё где то опубликован то он передран с этого блога.

  54. Ирина

    Нашла вот такую строку .

    Помогите пожалуйста — еще только начинаю осваивать все это — как надо ее преобразовать?

    спасибо!

    '

  55. Антон

    код здесь не выводится

Ваш комментарий