Думаю, проблема спама в комментариях WordPress знакома многим. Предлагаю метод, который поможет раз и навсегда избавиться от спама в комменты на движке WordPress. Причём мы не будем устанавливать никаких плагинов, а значит сохраним ресурсы сервера, они нам ещё пригодятся. К тому же данную операцию придётся выполнить только один раз и после этого можно будет смело забыть о том что такое спам на WordPress. Навсегда. Я использую данный метод давно и он никогда ещё меня не подводил. Это работает куда эффективнее любых плагинов типа Akismet и пр.
Суть метода состоит в скрытии стандартной формы для ввода комментариев, вместо неё пользователь будет видеть новую форму комментирования (точно такую же на вид, мы её добавим сами) и комментарии будут приниматься только с этой новой формы. В то время как роботы будут по-прежнему заполнять стандартную форму комментирования, которая попросту будет отключена. На самом деле тут всё очень просто и вы сейчас это поймёте.
Для начала нам нужно создать новую форму комментирования (копию стандартной). Тут возможны два варианта. Дело в том, что в более старых темах WordPress для вывода комментариев используется функция «textarea», а в новых – функция «comment_form».
Чтобы проверить какая функция у вас, откройте файл comments.php вашей темы и найдите там примерно такую запись
<textarea id="comment" class="textarea" name="comment"></textarea>
Например, у меня в этом шаблоне запись выглядит так
<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></p>
Основной признак – начало функции: «<textarea...»
Можно воспользоваться поиском (Ctrl+F) по слову «textarea» в файле comments.php или просто найти её визуально, благо файл небольшой. Если подобная запись присутствует, значит у вас старая функция и вы делаете всё как написано в пункте 1 ниже. Если такой строчки нет, значит у вас новая функция и вы делаете всё по пункту 2. Пункт 3 обязателен для выполнения в обоих случаях.
1*. Итак, у вас старая функция. Меняем в файле comments.php код
<p><textarea id="comment" class="textarea" name="comment"></textarea></p>
На такой
<div class="comm"> <textarea id="comment" class="textarea" name="comment"></textarea> </div> <p><textarea id="real-comment" class="textarea" name="real-comment"></textarea></p>
То есть стандартной форме комментирования мы присвоили класс «comm» и обернули её в <div>, а также добавили новую форму «real-comment», взяв за основу стандартную форму, но при этом изменили в ней name и id с «comment» на «real-comment».
При этом используем код функции своего шаблона, к примеру, если у меня в шаблоне изначально код функции вывода комментов был такой
<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></p>
Я заменил его на такую конструкцию
<div class="comm"> <textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea> </div> <p><textarea name="real-comment" id="real-comment" cols="100%" rows="10" tabindex="4"></textarea></p>
Если вы всё сделали правильно, то теперь у вас под каждым постом должно выводится две одинаковые формы комментирования. Пришёл черёд скрыть стандартную форму комментирования от пользователей. Именно для этого мы присвоили ей класс «comm» (кстати, вы можете обозвать этот класс по-своему).
Открываем файл style.css нашей темы и дописываем в нём стиль для класса «comm»
.comm {position: absolute; left: -1000px;}
либо такой вариант
.comm {display: none;}
На ваш выбор. Первый вариант смещает форму на 1000 пикселей влево и она становится не видна, второй просто запрещает её показ. Просмотрите свой сайт в браузере IE и выберите тот вариант стиля, который корректно убирает вторую форму комментариев со страницы (с остальными браузерами никаких проблем быть не должно).
Теперь стандартная форма комментариев скрыта от пользователей (но не от ботов). Однако это ещё не всё. Теперь вам нужно выполнить пункт 3.
2*. В вашем шаблоне используется новая функция «comment_form». Если в вашей теме WP для вывода комментов используется новая функция «comment_form», действуем следующим образом: открываем файл functions.php и дописываем в нём
//добавляем новую форму ввода комментария начало кода 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-real-comment"> <label for="real-comment">Комментарий</label><textarea id="real-comment" aria-required="true" rows="8" cols="45" name="real-comment"></textarea> </p>'; return $default; } //добавляем новую форму ввода комментария конец кода
Затем скрываем стандартную форму комментариев, дописав в style.css
.comment-form-comment {display: none;}
Переходим к выполнению пункта 3.
3*. Включаем в работу новую форму и отключаем стандартную. Что мы имеем на данный момент: у нас теперь 2 формы комментариев на сайте, причём стандартная форма скрыта от посетителей. Соответственно посетители будут заполнять только ту форму, которую они видят, а именно новую форму, добавленную нами. Теперь прописываем правило, согласно которому комментарии из стандартной формы комментирования (которую будут заполнять боты) станут попросту игнорироваться. А комментарии из новой формы будут проходить проверку.
Открываем файл 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['real-comment']); $_POST['comment'] = $comment_content; return $commentdata; } //спам контроль конец
Вот и всё. Про спам мы больше не вспоминаем. Если есть вопросы – прошу в комменты. Если вопросов нет – отлично.
P.S. Перед внесением изменений в движок сайта, а так же время от времени не забывайте бэкапить БД и делать полные резервные копии сайта.
Все сделал по вашему совету. Получилось только форма для ввода текста теперь разъехалась на всю ширину шаблона. Как это исправить?
Вижу у вас форму ввода текста нормального размера, если вы про тот сайт что в подписи. Как я понял у вас старая функция, то есть вам нужно выполнить шаги 1 и 3, используя свой код textarea.
А в каком браузере вы смотрите. У меня стоит хром и окно для ввода текста растянуто на всю ширину шаблона. Как это можно исправить?
У вас так было с самого начала или это произошло после действий по подмене формы комментариев на новую? Если второе, то вы что то сделали не так.
Вообще так стало после подмены. Я ка только сделал первый шаг и появилось два окна для текста — они сразу вытянулись на всю ширину шаблона. В чем может быть причина и как поправить?
Александр, смотрю вы уже исправили самостоятельно изменив cols="100%" на cols="55%". Что ж, тоже вариант.
какой классный и в то же время простой метод! респект!
просто подменить форму... мне нравится!
Евгений, метод действительно простой и отлично работающий. Ещё один его плюс в том что выполнить эти действия придётся только один раз. Ни при обновлении движка и других моментах повторять процедуру не требуется.
Кто пробовал? Методика действительно рабочая?
Владимир, вполне. Использовал этот метод на массе сайтов. Да и не только я видимо. Я не пишу тут о том, что не работает. А если и пишу, то предупреждаю что не проверял.
А можно таким образом отсеить спам регистрацию?
очень актуально!
Ольга, никогда не работал с регистрацией.
Ваш код для комментариев у меня работает на отлично.
Я пыталась сделать для регистрации, как написана в этой статье _http://acid.name/?p=1027 Но там автор, действительно, что-то напутал.
Пыталась объединить его метод и ваш, но что-то не выходит.
Ольга, не могу сказать в чём дело. Может автор статьи напутал, либо метод нуждается в доработке именно под ваш шаблон, не знаю.
Вставил как написано по пунктам 2 и 3 . Форма не отображаеться ваша, моя не пропадает. Комментарии все сливаются (пишет «спам»). И все комментарии в вордпрессе не появляются.
Может вы поподробнее опишите где именно вставляються в эти файлы ваши куски... я ставил все в конце файлов и ничего.
Не имею понятия в чём проблема.
Одна проблема — на одном блоге пытался поставить, у меня несколько плагинов работают с выводом комментариев и формы. пришлось везде все править.
Devvver, ну а что делать, приходится иногда повозиться.
Все работает, спасибо! Теперь еще одним плагином меньше. Раньше я использовал этот Akismet и плюс неплохой плагин WP Ban. Теперь можно удалять Akismet.
У меня только первый код находился не в comment.php, а в comment-template
Ну и отлично.
Добрый день! У меня wordpress 3.5.1 В шаблоне comments.php используется функция «comment_form».
Следуя пункту 2, вставляю тупо кусок Вашего кода после закрывающей скобки comment_form, обновляюсь — ничего не выводится. Насколько я понял, должна выводится вторая форма комментов).
Должна. Обновите кэш в браузере и кэширующих плагинах wordpress если есть.
Все работает, читайте внимательней статью. Антон, как поставить разделительную черту как у Вас между датой и временем: 17.04.2013 | 16:54 Спасибо.
я её не ставил, так и было. в functions.php —
<div class="comment-meta commentmetadata c_date "><?php echo get_comment_date() . ' | ' . get_comment_time(); ?> <?php edit_comment_link(__('(Edit)'),' ','') ?></div>
Спасибо. Пригодилось для моего блога
Проверим, работает ли...
Классный способ. Молодца Я сам не люблю, когда по каждому чиху надо плагин ставить. А тут всё чётко и понятно. Чуток код подправил и ништяк.
Так держать, Антоха!
Большое спасибо!
Спасибо большое за такой полезный урок! Меня спам комментарии просто убивали — до 100 штук в день, теперь, надеюсь всё будет ок:)
Только вот я не совсем пойму, но раз комментарии всё равно будут роботы писать на старую форму, которая не отображается, куда они будут деваться? Или нет формы — нечего спамить?
(Наверное, глупый вопрос, но в технических вопросах я не сильна))
Юлия, форма не рабочая и потому заполняться не будет.
У меня каким-то образом она осталась, наверное, рабочей или мои спамеры — ну суперкрутые спамерщики — утром появилось 8 новых спам-комментариев(((
Юлия, делайте как написано в статье и всё будет норм. Стандартную форму мы отключили в functions.php.
Сделал всё как написано, второй и третий пункты. Старая форма поменялась на новую, но стала не рабочей кнопка «Оставить комментарий». Тема Sahifa.
Эмиль, если всё сделали правильно то надо смотреть шаблон.
У меня тоже так и не получилось, хотя всё сделала как надо (я доставила плагин с невидимой капчей и теперь всё ок)
Юлия, значит тоже какой то конфликт с темой. Надо смотреть код. Обратитесь к фрилансерам, думаю за 3$ и три минуты времени вам решат вопрос. Ну или пользуйтесь плагином.
Долго мучился со спамом, от капчи и аксимета толку практически никакого. Пару дней назад воспользовался этим методом — до сих пор нарадоваться не могу. Большое спасибо.
Rod, не за что.
C некоторых пор на сайте в браузере выводятся битые аватары анонимных комментаторов, в админке отображаются правильно. В чем причина не подскажите?
aleksandr, разве у анонимных комментаторов есть аватары? на то они и анонимные. скриншот проблемы в студию пожалуйста.
и почистите кеш браузера.
Спасибо за внимание, проблему уже решил, изменив код функции вывода аватара по умолчанию.
Ну вот и отлично. Многие шаблоны требуют индивидуального подхода, вы молодец что разбираетесь в коде.
Добрый день,
когда вставляю самый первый код, форма комментариев вообще пропадает, ни Вашей , ни моей?
у меня вот такой код: 'comment_field' => '',
Может я нашел не то?
Подскажите.
Спасибо
значит что то неправильно сделал. в статье всё объясняется подробно. читайте внимательно и делайте как написано. на некоторых темах может не работать (редко).
Спасибо!)
Особенности в моем случае: в файле comment.php была два поля с textarea. Пришлось заменять оба, иначе не появлялись два поля. Остальное прошло так же.
Из минусов — съехал правый сайдбар вниз. Буду испралять)
Ксения, положение комментариев можно регулировать.
Можно) Но «чайникам» этого лучше не делать 😉 Я убрала код функции своего шаблона и все встало на место. Разницы не заметила.
Молодец.
К сожалению, мои роботы-спамщики обошли защиту( 95 спам комментариев за ночь((
Значит вы что то не так сделали. Если спам проходит значит не отключили стандартную форму в functions.php. А уж вывели ли новую я не знаю.
Таки да... functions.php коряво заливался. Буду смотреть, вроде файл уже нужный лежит. Спасибо!
Отличная статья. Уже второй раз применяю данный метод на своих сайтах.
метод эсклюзивный. если ещё где то опубликован то он передран с этого блога.
Нашла вот такую строку .
Помогите пожалуйста — еще только начинаю осваивать все это — как надо ее преобразовать?
спасибо!
'
код здесь не выводится