WordPress как на ладони

Блокируем Спам в комментариях

Этот пост уже не актуален!

Теперь от спама я избавляюсь используя свой плагин, подробнее тут: Плагин для блокировки спама в комментариях (для WordPress).

Давно хотел придумать свой метод избавится от спам комментов. Ради этого, даже не ставил ни на один из своих сайтов никакой защиты от спама, чтобы он меня достал и в итоге я придумал бы что-нибудь эдакое (хотя спам сильно и не беспокоил - настройки ВП тоже на что-то годятся). Идей было достаточно много, но все они по тем или иным причинам меня не устраивали. Хотелось чего-то крайне простого и в тоже время надежного, без каптчи, без всяких чекпоинтов и т.п.

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

Рождение идеи

Идея нижеописанного способа родилась буквально по ходу написания предыдущей статьи, - "Как запустить обработку формы используя JavaScript".

В предыдущей статье я описал, как можно засабмитить форму используя ссылку вместо стандартной кнопки button. В период написания статьи я подумал, а что если удалить кнопку подтверждения комментария, что будет в результате? Спам проги, все равно будут, сабмитить форму, потому что им для этого кнопка вообще не нужна, они просто сабмитят форму и все тут (это я кстати проверил, так и есть - кнопка не нужна, спам приходит даже, если вообще убрать кнопку submit). Следующим шагом моей мысли стал, - "а что, если жестко привязать возможность комментировать к кнопке подтверждения комментария, тогда стандартный способ сабмита формы комментирования не будет работать вовсе, что и требовалось доказать"! Т.е. нужно сделать, так, чтобы для отправки комментария обязательно нужно было использовать кнопку комментирования и никак иначе, в противном случае комментарий не отправляется туда куда нужно. Реализовать это получилось очень просто.

Итак, к делу.

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

Чтобы избавится от спама нужно открыть файл темы comments.php и найти там форму комментирования. Начало кода примерно такое:

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

Затем, нужно сделать три легких движения:

#1 Изменить ссылку на файл обработчик, куда форма отправляет данные:

В подобной строке:
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

Нужно изменить значение атрибута action. Например, так:
<form action="/logo.gif" method="post" id="commentform">

Здесь я поставил ссылку на картинку logo.gif.

Писать можно что угодно, главной убрать стандартную ссылку /wp-comments-post.php.

#2 Затем, перед этой строчкой (которую только что отредактировали), нужно добавить следующий javascript:

<script type="text/javascript">
function cform(){
	document.getElementById("commentform").setAttribute("action", "/wp-comments-post.php");
	document.forms["commentform"].submit();
}
</script>

#3 И наконец, добавить к кнопке подтверждения формы такой код: onclick='cform()':

Выглядит примерно так:

было:

<input type="submit" id="submit" value='Комментировать' tabindex="5" />

стало:

<input type="submit" id="submit" value='Комментировать' tabindex="5" onclick='cform()' />

Вот и все, осталось только залить файл comments.php на сервер и забыть про автоспам в комментариях smile

Минусы у этого способа:

  • При отключенном JavaScript невозможно будет оставить комментарий. Но это не страшно, ведь сегодня JavaScript неотъемлемая часть любого сайта.
  • Не будет работать при сабмите через Enter.
Дополнительная информация

Вышеописанный способ не спасет от автоспама, если спам-прога умеет имитировать нажатие кнопки сабмита (вроде это большая редкость), поэтому чтобы на 100% защититься, у себя на сайтах я вообще удаляю эту кнопку, а вместо нее ставлю ссылку, т.е. подтверждение производится по ссылке, выглядит она так:

<a href="javascript: cform()" id="submit" tabindex="5">Комментировать</a>

Теперь, даже если спам-прога умеет имитировать нажатие на кнопку, она просто эту кнопку не найдет, потому что её нет. А кликнуть по ссылке, чтобы подтвердить комментарий, такого я вообще нигде не встречал, поэтом спам-проги на это точно не рассчитаны.

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

Обратите внимание

Некоторые спам-проги постят комментарий прямо в файл wp-comments-post.php, т.е. отправляют комментарий не со страницы сайта.

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

## Блокирует комментарий, если он был отправлен не с комментируемой страницы
add_action( 'pre_comment_on_post', 'kama_check_comment', 0 );

function kama_check_comment( $comment_post_ID ){

	$ref = trim( preg_replace( '!/comment-page.*|https?://(.*?)/|#.*|\?.*!i', '', $_SERVER['HTTP_REFERER'] ), '/' );
	$permalink = trim( preg_replace( '!/comment-page.*|https?://(.*?)/|#.*|\?.*!i', '', get_permalink($comment_post_ID) ), '/' );

	if( $permalink !== $ref ){
		wp_die( "REFERER: $ref<br />LINK: $permalink<br /> You have no permission to post a comment!" );
	}

	return $comment_post_ID;
}
23 комментария
    Войти