Блокируем Спам в комментариях
Этот пост уже не актуален! Теперь от спама я избавляюсь используя свой плагин, подробнее тут: Плагин для блокировки спама в комментариях (для 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
на сервер и забыть про автоспам в комментариях
Минус у этого способа: при отключенном JavaScript невозможно будет оставить комментарий. Но это не страшно, ведь сегодня JavaScript неотъемлемая часть любого сайта.
Дополнительная информация
Вышеописанный способ не спасет от автоспама, если спам-прога умеет имитировать нажатие кнопки сабмита (вроде это большая редкость), поэтому чтобы на 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!" ); else return $comment_post_ID; }
Редактируя старые статьи, обнаружил, что в комментарии создаётся спам редактируемой статьи. Как избавиться?
Читал и орал от гениальности первого способа, спасибо) Очень полезно