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


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

Решил пожертвовать ресурсами сервера, но избавится от спама. Установил и активировал плагин 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 и выше, этот способ нуждается в доработке. И вот статья на эту тему.

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



Если статья оказалась для Вас полезной, поделитесь с друзьями, жмите на кнопочки:


Подписывайтесь на новые статьи!


Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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

  • Павел Пашкан

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

    • Максим Зайцев От автора

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

  • Николай Вилков

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

    • Максим Зайцев От автора

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

  • Виктория

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

    • Максим Зайцев От автора

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

  • Николай Вилков

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

    • Максим Зайцев От автора

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

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

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

  • Denis

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

    • Максим Зайцев От автора

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

  • Валентина

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

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

    • Максим Зайцев От автора

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

  • Сергей

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

    • Максим Зайцев От автора

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

      • Сергей

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

        • Максим Зайцев От автора

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

  • Александр

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

    • Максим Зайцев От автора

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

  • Claus

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

    • Максим Зайцев От автора

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

    • Максим Зайцев От автора

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

  • Сергей

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

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

  • Сергей

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

    • Максим Зайцев От автора

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

      • Сергей

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

        • Максим Зайцев От автора

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

          • Сергей

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

          • Максим Зайцев От автора

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

  • Антон

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

    • Максим Зайцев От автора

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

  • Николай

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

    • Максим Зайцев От автора

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