Давно хотел придумать свой метод избавится от спам комментов. Ради этого, даже не ставил ни на один из своих сайтов никакой защиты от спама (хотя спам сильно и не беспокоил - настройки ВП тоже на что-то годятся), чтобы он меня достал и в итоге я придумал бы что-нибудь эдакое. Идей было достаточно много, но все они по тем или иным причинам меня не устраивали. Хотелось чего-то крайне простого и надежного, без подключения плагинов, без капти, без всяких чекпоинтов и т.п.
К слову, о простоте и надежности, можно, конечно, вообще отключить комментарии - куда уж надежнее и проще, но это больше попахивает, - "надоело, я здаюсь", а еще, как говорится, "безвыходных ситуаций не бывает", и борьба со спамом, это как раз та область где можно пофантазировать насчет изящного и простого способа... 
Поясню, что речь идет не о ручных спам комментах, т.к. от них избавится гораздо сложнее и, пожалуй, это тема другой статьи, а о спаме который оставляется различными специализированными программами.
Рождение идеи
Идея нижеописанного способа родилась буквально по ходу написания предыдущей статьи, - "Как запустить обработку формы используя 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.
/* Хук, который блокирует комментарий, если он был отправлен не с комментируемой страницы
-------------------------------------------------------------------------------------------- */
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;
}
add_action('pre_comment_on_post', 'kama_check_comment',0);
Есть какие либо вопросы? Задавайте в комментариях!
- Предыдущие по меткам
- Предыдущие записи
- Функция для вывода последних комментариев ← 11.Апр.2010 // 109
- Меняем символы ХТМЛ (< >) на спецсимволы при комментировании ← 16.Апр.2010 // 12
- Добавляем допустимые теги в комментариях ← 2.Апр.2010 // 6
- Как запустить обработку формы используя JavaScript ← 10 Май 2010 // 5
- Файл шаблона functions.php в WordPress ← 6 Октябрь 2010 // 21
- Перелинковка статей в WordPress (предыдущие записи из категории) ← 4 Май 2010 // 94
Хороший способ, буду использовать у себя..
Да, интересный способ. Думаю, с помощью JavaScript можно придумать множество подобных вариантов защиты.
я пока только начинающий пользователь wp но уже успел побывать на ХЗ каком колличестве сайтов посвященные WP, и могу с твердой увереностью сказать, что ваш блог один из лучших, спасибо.
Интересно, думаю стоит попробовать
Сегодня обнаружил, что есть спамеры, которые вообще не через страницу постят комментарии, а отправляют данные напрямую в файл wp-comments-post.php.
При таком раскладе, этот способ спам не отфильтрует. Поэтому, потихоньку созревает статья - "избавляемся от комментариев (часть 2)".
Так и есть, но сейчас (полсе разбора wp-comments-post.php) начинаю понимать, что все они будут сводится к хукам pre_comment_on_post или comment_post. Имею ввиду, как не крути, а блокировать комментарий нужно в файле wp-comments-post.php.
Кстати, да. Я давно об этом знаю и забыл упомянуть. Читал, что проблему решают путем переименования файла wp-comments-post.php с соответствующими изменениями в php-файлах.
По-моему это лишнее!
Можно и без переименования, по крайней мере с версии 2,8 в wp-comments-post.php добавили новый хук (action - действие), через него можно удобно заблокировать спам
Вот хук, которым можно предотвратить комментирование прямо в файл wp-comments-post.php
/* Хук, который блокирует комментарий, если он был отправлен не с комментируемой страницы -------------------------------------------------------------------------------------------- */ 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("You have no permission to post a comment!"); else return $comment_post_ID; } add_action('pre_comment_on_post', 'kama_check_comment',0);Код проверяет рефер-ссылку, откуда был отправлен post запрос. Если Рефер-ссылка не равна ссылке комментируемой страницы, то комментарий блокируется (выводится сообщение - You have no permission to post a comment!).
Отличный метод! А чтобы ссылка была похоже на кнопку, ее просто рисуем как кнопку и вставляем внутри ссылки! Возьму себе этот метод на вооружение, вместо чекбокса "я не робот" )))
А подскажите какой плагин комментариев вы используете, а то хочу на своем блоге реализовать тоже бб коды и смайлы.
Коды, этот плагин: http://wordpress.org/extend/plugins/jquery-comment-preview/
Смайлы, мой плагин: http://wp-kama.ru/id_185/palagin-cmaylikov-na-lyuboy-vkus-v-postah-i-kommentariyah-dlya-wordpress.html
Да уж, хороший способ и мало замороченный, но не идеальный.
===
У меня за день 517 спам-комментов набегает, если их в ручную потом искать - с ума сойдешь. Поэтому я поставил офигенный плагин Невидимая Капча и в ус не дую.
---
Зашел в корзину, удалил весь хлам одним нажатием кнопки и крааасатища!
===
Естественно тем, кто любит и умеет копаться в кодах - этот метод хорошая разминка для воображалки, возможно кто-то пойдет дальше и придумает что-то необычное и безупречное.
Пользуюсь Invisible Captcha, смысл почти тот же)