100% защита от автоспама в комментариях

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

пример автоспама админка wordpress

Трудно поверить, верно?

Причем, папку спам я постоянно очищаю, это комментарии за один раз – за промежуток времени, в течение которого я не заходил в админку (не больше месяца).

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

Полный бред.

Так как все эти комменты оставляют боты, то их легко можно обмануть.
Бот заточен под WordPress? – значит надо сделать форму комментариев, не похожую на стандартную вордпрессовскую.

<form method="POST" name="commentform">
	<input type="text" name="author" id="author" />
	<input type="text" name="email" id="email" />
	<textarea name="comment" id="comment"></textarea>
</form>

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

	<textarea name="comment" id="comment"></textarea><!-- фейк -->
	<textarea name="true_comment"></textarea><!-- настоящее -->

Теперь надо, чтобы WordPress понимал, какое поле настоящее, а какое нет и в случае чего давал пенделя кому следует. Этот код – в functions.php

function stop_spam($commentdata) {
	$fake = trim($_POST['comment']);
	if(!empty($fake)) wp_die('Ошибка!');
		$comment_content = trim($_POST['true_comment']);
	$_POST['comment'] = $comment_content;	
	return $commentdata;
}
 
add_filter('pre_comment_on_post', 'stop_spam');

Ах да, ведь теперь же у нас два поля для ввода комментария 🙂
Заюзаем CSS.

#comment{
	position:absolute;
	left:-9000px;
}

Функция comment_form()

Нет, я не буду сейчас описывать эту функцию (описанию функции comment_form() посвящен отдельный пост), скажу лишь что, начиная с версии WordPress 3.0, она может отвечать за вставку формы комментария.

Что делать, если она используется на вашем блоге? Нужно в functions.php добавить ещё кое-что (то, что мы добавляли раньше, удалять не нужно).

function edit_comment_form_fields($default) {
	$commenter = wp_get_current_commenter();
	$default['comment_notes_after'] .= 
	'<p class="comment-form-true_comment">
	<label for="true_comment">Ваш комментарий:</label>
	<textarea id="true_comment" name="true_comment" rows="8" cols="45" aria-required="true"></textarea>
	</p>';
	return $default;
}
 
add_filter('comment_form_defaults', 'edit_comment_form_fields');

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

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

В WP 4.4 изменился код файла wp-comments-post.php, находящегося в корне вашего сайта, таким образом, что наш хук pre_comment_on_post запускается слишком поздно и уже не успевает выполнять свою функцию. Альтернативы в виде хуков я не нашёл, поэтому представляю вам другое, также весьма простое решение.

  1. Если у вас ещё используется хук из предыдущего шага, удалите его.
  2. В корне сайта создайте файл с произвольным названием, например antispam.php и поместите туда следующий код:
    <?php
    $fake = trim($_POST['comment']);
    if(!empty($fake))
    	exit;
    $_POST['comment'] = trim($_POST['true_comment']);
     
    require( dirname(__FILE__) . '/wp-comments-post.php' );
  3. Замените атрибут формы action на ссылку на этот файл (antispam.php). Если вы используете comment_form() для вывода формы, то замену проще всего сделать через JavaScript.
Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

Смотрите также