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

Друзья, всем привет. Сегодня буду говорить о наболевшем. Уверен, каждый владелец сайта рано или поздно сталкивается с проблемой СПАМа. Как правило, это проблема появляется, когда блог начинает развиваться. Я вот поначалу, создал блог и не напрягался по этому поводу, ну был один–два спам-комментарий в день, так я их легко убирал вручную. Но, дальше хуже, спама всё больше и больше. Тогда я решил выбирать из двух зол.

Решил пожертвовать ресурсами сервера, но избавится от спама. Установил и активировал плагин Akismet. Результат меня порадовал, 99% защиты от спама. Хотя это может быть и 100%. Но, у этого плагина свои алгоритмы работы и иногда хорошие комментарии попадают в спам.

Хорошие комментарии в спаме
Хорошие комментарии в спаме

Поэтому я не стал автоматически очищать папку спам, проверяю её и выдёргиваю хорошие комментарии, если они туда попали. Ну и казалось бы всё хорошо, так вот теперь надоело просматривать папку СПАМ. В последнее время у меня не так много времени, и успеваю просматривать блог пару раз в день. Так, за день у меня бывает до 250 спам-комментариев. Вот пример, сегодня до обеда уже 78 комментариев в папке спам.

Спам-комментарии за полдня
Спам-комментарии за полдня

А ещё есть «чудесники», которые занимаются ручным спамом. Но для них есть свои рычаги воздействия. Мы же поговорим, как избавиться от автоматического спама, рассылаемого спам-ботами. И при этом не придётся чистить папку СПАМ.

Суть метода

Этот метод, прежде всего, хорош тем, что на 100% защищает от СПАМа и при этом без плагина. А плагин выполняющий до этого эту защитную функцию вы сможете отключить и тем самым ускорить работу вашего сайта/блога.

А раз нет плагинов, значит, придётся поковырять в исходном коде шаблона. В общем, нужно будет сделать подмену полей формы комментария. Таким образом, у вас будет фактически две формы комментариев, одну будут заполнять посетители, а другую будут бомбить спамерские программы.

Как создать подмену формы комментария

Шаг 1. Определяем, какой функцией выводится поле «Текст комментария»

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

В контекстно-зависимом меню нажмите на пункт «Исследовать элемент» (или что-то подобное, в разных браузерах по-разному).

А теперь посмотрите на исходный код:

Текстовое поле textarea
Текстовое поле textarea

Во многих темах за вывод текстового поля в форме отвечает textarea, поэтому в исходном коде вы увидите вот такую строку, или что-то похожее.

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

Эту строчку кода нужно будет найти в файле comments.php.  Если подобной строки кода у вас нет, то реализация вашего случая будет описана в конце статьи.

Шаг 2. Создаём дубликат текстового поля «Текст комментария»

Переходим в административную панель WordPress – раздел «Внешний вид»«Редактор». Открываем для редактирования файл comments.php. Находим в этом файле текстовое поле для ввода комментария. Нажмите CTRL+F и ищите textarea.

Теперь нужно скопировать весь этот код и вставить его ниже. У вас должно получится две одинаковые строчки кода.

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

Далее нужно изменить атрибут name и id. Я предлагаю добавить приставку main. Получится так:

<p><textarea name="main-comment" id="main-comment" cols="100%" rows="10" tabindex="4"></textarea></p>
Дублирование текстового поля
Дублирование текстового поля

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

placeholder="Введите текст комментария"

Тогда вся строчка кода будет выглядеть вот так:

<p><textarea name="main-comment" id="main-comment" placeholder="Введите текст комментария" cols="100%" rows="10" tabindex="4"></textarea></p>

Сохраняем внесённые изменения.

Шаг 3. Скрываем оригинальное поле «Текст комментария»

Сейчас, если вы посмотрите на свою форму комментария, то у вас будет два текстовых поля. Одно из них нужно скрыть. И поможет нам в этом идентификатор (id). Этот идентификатор можно использовать для придания стиля. Хотя можно определить стиль прямо в строке с кодом текстового поля, но мы это будем делать в файле style.css. Это тоже ради поддержания высокой скорости загрузки сайта.

Итак, открываем файл таблицы стилей style.css. Нам нужно добавить стиль, который будет скрывать одно текстовое поле. Этот стиль можно добавить в самом низу этого файла.

/*скрываем форму комментария*/
#comment {display:none;}

Шаг 4. Подключение фильтра для проверки комментариев.

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

Для этого открываем файл функции темы (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['main-comment']);
  $_POST['comment'] = $comment_content;
  return $commentdata;
}
/*фильтр для спама*/

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

Фильтр для спама
Фильтр для спама

Примечание: если для атрибутов name и id вы использовали предложенную мной приставку main, то в этом коде менять ничего не надо. Если же вы использовали свою приставку или свой набор символов, то необходимо изменить подсвеченный цветом фрагмент кода.

Вот и все готово теперь нужно подождать и проанализировать, сколько комментариев попало в папку спам. По идее ваша папка спам будет пуста, а на блоге будут появляется только одобренные комментарии.

Что делать если текстовое поле формируется не через textarea

Если при просмотре файла comments.php, вы не обнаружили текстового поля textarea. Значить у вас стандартная форма комментариев выводится через функцию comment_form. Как правило, работа этой функции прописана в файле функции темы (functions.php). Вы легко сможете её найти с помощью поиска CTRL+F. В общем, вам нужно сделать дубликат формы комментариев. Для этого найдите в файле подходящее место, как я показывал выше, и вставьте вот этот код:

/*новая форма комментария*/
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-main-comment">
  <label for="main-comment">Комментарий</label><textarea id="main-comment"
  aria-required="true" rows="10" cols="45" name="main-comment"></textarea>
  </p>';
  return $default;
}
/*новая форма комментария*/

Теперь вставьте код для проверки на спам, который я приводил в четвёртом шаге. Сохраняете файл функции темы (functions.php) и переходите в файл таблица стилей (style.css).

Здесь нужно добавить стиль для сокрытия стандартного текстового поля ввода комментария.

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

Всё, задание выполнено. Теперь спам не пройдёт.

Кстати, если ваша стандартная форма отличается по ширине и по высоте, то измените параметры строк и колонок (rows="8" cols="45").

Итак, дорогие друзья, подвожу итоги. Статью я писал два дня, и за это время не одного спам-комментария. Папка СПАМ пуста и я очень доволен. Так что берите метод на вооружение и не тратьте своё время на просмотр спам-комментариев. А ещё советую посмотреть статью о создании формы обратной связи с защитой от спама. Принцип защиты у них схожий.

Также посмотрите видеоурок, так этом метод станет для вас ещё понятней.

На этом у меня сегодня всё, желаю вам удачи и 100%-е отсутствие спама. Всем пока, и до встречи в новых статьях и видеоуроках.

Дополнение: после обновление WordPress до версии 4.4 и выше, этот способ нуждается в доработке. И вот статья на эту тему.

С уважением, Максим Зайцев.

Понравилась статья? Поделиться с друзьями:
Комментарии: 39
  1. Павел Пашкан

    Наконец то… Меня многие поймут, когда я скажу что уже эти спамшики у горла сидят, а тут вот и выход из ситуации… спасибо Максим!!!

    1. Максим Зайцев (автор)

      Паша, как я тебя понимаю. Надеюсь ты сможешь решить эту проблему.

  2. Николай Вилков

    Довольно интересное решение, но я смысл до конца не уловил, за счет чего ловятся спам комментарии и для чего 2 формы для комментирования, одна из них скрыта.

    1. Максим Зайцев (автор)

      Николай, суть в том, что реальный человек заполняет одно поле в форме, а робот другое. В зависимости от того какое поле заполнено и результат. Вот ваш коммент прошёл без проблем, а спам был бы удалён. Завтра видеоурок доделаю, будет всё понятней.

  3. Виктория

    Максим, привет) Жду видеоурока, попробую сделать у себя, а то спам реально надоел:)

    1. Максим Зайцев (автор)

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

  4. Николай Вилков

    Всё равно не до конца понял, подожду видео-урок. Если одна форма комментариев скрыта из двух, то как ее может робот заполнять?

    1. Максим Зайцев (автор)

      Николай, метод основан на том, что человек видит и заполняет одно поле, а робот другое. Видеоурок уже опубликовал.

  5. Андрей Назыров

    Отличная инструкция, получается принцип как в плагине Invisible Captcha, который использую я.

    1. Максим Зайцев (автор)

      Спасибо, Андрей. Да, принцип похож, но без плагина ;-)

  6. Denis

    Привет Максим! Отличное решение от спамеров, хоть оно и старо как мир,да и спамеры не дремлят и эволюционируют.Вообще беда со спамом на вордпресс будет всегда.
    Есть пара недочетов в статье:
    1)»Если при просмотре исходного кода, вы не обнаружили текстового поля textarea»
    В исходном коде этот тег будет всегда — это основа HTML
    2)»Значить у вас стандартная форма комментариев выводится через функцию comment_form.Как правило, работа этой функции прописана в файле функции темы (functions.php).»
    Функкция берется из ядра(движка) WordPress
    С помощью такого решения можно избавиться от двух плагинов(Акисмет,капчи), плюс можно внедрить функционал в форму обратной связи для защиты от спама!

    1. Максим Зайцев (автор)

      Денис, привет. Реально, спам уже достал. И этот способ просто порадовал своей простотой и эффективностью. По поводу недочётов согласен, возможно подправлю, как будет немного больше свободного времени. Денис, и спасибо за совет по форме обратной связи, я всегда использовал капчи, а ведь это решение куда лучше.

  7. Валентина

    Здравствуйте,Максим. Отличная статья. Единственное, что при четвёртом шаге, когда надо вставить html код фильтра для проверки комментариев, я не знаю в какое место его лучше вставить.Пробовала несколько раз после фигурных скобок этой фразы:} else return $content;
    } — но слетает сайт. Помогите пожалуйста. Привожу саму функцию:

    »,
    ‘after_widget’ => »,
    ‘before_title’ => »,
    ‘after_title’ => »,
    ));
    ?>

    1. Максим Зайцев (автор)

      Здравствуйте, Валентина. Вставьте этот код в самом конце файла functions.php, пред закрытием кода ?>. И все будет работать.

  8. Сергей

    Отличный метод но — перестают работать смайлики. Видимо они привязаны к форме — которая скрывается.

    1. Максим Зайцев (автор)

      Здравствуйте, Сергей. Как они перестают работать? Если просто исчезают, то это из-за того, что стили смайлов и скрытого поля перекликаются. Нужно просто сменить стиль оформления.

      1. Сергей

        Не работают вставка смайликов в само поле комментария (которое прячем/вставляем). Для смайликов использую плагин wp-Monalisa. Надо порыться в коде этого плагина и настроить его на id нового поля.

        1. Максим Зайцев (автор)

          Да, думаю этот вариант поможет. Будет интересно узнать о результатах.

  9. Александр

    Спасибо, буду разбираться, а то так-же надоели спамеры.

    1. Максим Зайцев (автор)

      Желаю удачи, Александр! Будут вопросы, пишите.

  10. Александр

    Здравствуйте, скажите а что мешает запрос отправить через правильный texarea? нужно просто пропарсить код выдернуть скрытый textarea и получит его имя или я чего то не понял?

    1. Максим Зайцев (автор)

      Здравствуйте, Александр. И много таких прошаренных вы знаете? В ваших словах есть истина, но никто этим реально не будет заниматься. Из всех способов защиты — этот работает лучше всего. Проверено временем и сотнями владельцев сайтов и блогов.

  11. Claus

    После обновления WordPress, перестала работать подмененная форма. В основной форме комментариев появился атрибут «required». Вся эта идея перестала работать потому что основная форма требует заполнения. Не знаете как решить проблему?

    1. Максим Зайцев (автор)

      Добрый вечер, Claus. Вы, наверное, имеете ввиду обновление вашей темы оформления. Обновление движка на форму не влияет. Форма работает с регулярными обновлениями темы и движка.
      Для того чтобы я мог помочь, мне нужно взглянуть на форму комментариев. Укажите адрес сайта при следующем комментарии.

  12. Андрей

    Здравствуйте, код не работает больше

    1. Максим Зайцев (автор)

      Здравствуйте, Андрей. Да, в версии WP 4.4 этот способ перестал работать. В comment-tamplate сменились несколько параметров. Пока времени нет подправить. Как только подправлю, опубликую дополнение.

  13. Сергей

    Максим, добрый вечер. У меня вопрос по комментариям, но не по спаму. Подскажите, пожалуйста, как у Вас реализована опция «Сообщать о новых комментариях» под формой комментирования? Это скрипт или плагин?

    Заранее спасибо.

    1. Максим Зайцев (автор)

      Здравствуйте, Сергей. Эта функция реализована с помощью плагина Subsrtibe to Comments. Простой, лёгкий плагин.

      1. Сергей

        Понятно. Спасибо!

  14. Сергей

    Здравствуте Максим. Не знаю даже куда написать. У меня есть не большая проблема с кодом. Когда я в комментарии оставляю ссылку с анкором, то при ее переходе посетителю открывается страница, якобы авторизована от меня, при попытке оставить комментарий, автоматически заполняются мои данные. Не знаете что бы это могло быть? Спасибо.

    1. Максим Зайцев (автор)

      Здравствуйте, Сергей. Это происходит только у вас или у других посетителей тоже? Во всех браузерах похожая картина? Если да, то советую проверить сайт на вирусы. В кабинете вебмастера Майл есть отличный инструмент для проверки и лечения. Или можно использовать сервис от Яндекса Manul https://www.yandex.ru/promo/manul Желаю удачи!

      1. Сергей

        Только у посетителей. Ему открывается страница якобы под моим ником, при обновлении страницы перекидывает на страницу входа админки. В разных браузерах такая же картина. Спасибо, проверю обязательно. Может это произошло из за того что я ссылку из админ панели в комментарий анкором вставил?

        1. Максим Зайцев (автор)

          Да, это может быть из-за того что вы поделились ссылкой на админку. Но, всё таки проверьте сайт на вирусы.

          1. Сергей

            Спасибо Максим за советы. Вирусов нет.

          2. Максим Зайцев (автор)

            Это отлично. Значит причина в ссылке, которой вы поделились.

  15. Антон

    Здравствуйте. Хотелось бы увидеть исправленную версию кода под WordPress 4.5.3. Заранее спасибо :-)

    1. Максим Зайцев (автор)

      Антон, добрый день. Всё никак времени не выкрою для написания новой статьи. Для себя сделаю отметку в ежедневнике и постараюсь выкроить для этого время.

  16. Николай

    Здравствуйте, сделал все как написано в статье, у меня форма ввода комментов через функцию comment_form()
    Так вот создал я второе поле, но через него нельзя оставить комментарий, выводит ошибку следующего вида:
    ОШИБКА, пожалуйста введите комментарий
    Пожалуйста, помогите разобраться.

    1. Максим Зайцев (автор)

      Здравствуйте, Николай. После того, как обновился WordPress до версии 4.4 поля формы поменялись местами. И способ нужно немного дорабатывать. Статья на эту тему тут: http://1zaicev.ru/wordpress-zashhita-kommentariev-ot-spama/ Посмотрите статью и попробуйте ещё раз.

Добавить комментарий для Denis Отменить ответ