Спам является неотъемлимой частью WordPress движков. Устанавливая новый движок на своем хостинге, уже завтра его могут найти спам боты и оставлять десятки сообщений с ссылками. Это очень вредит продвижению, засоряет базу данных движка и постоянно требует вашего внимания.
Чаще всего спам приходит с формы комментариев (и других форм обратной связи, если они есть на сайте), там он обрабатывается формой и добавляется в БД сайта. Разберем разные методы борьбы со спамом, начиная с радикальных.
1. Чтобы избавиться раз и навсегда от спама:
а. Отключите регистрацию пользователей, если она вам не нужна на сайте: Настройки > Общие и убрать галочку в Членство =)
б. Далее запрещаем оставлять комментарии в WordPress: Настройки > Общие > Обсуждение убираем галочки "Разрешить оставлять комментарии на новые статьи".
Таким образом, мы полностью отключим возможность оставлять комментарии на новые статьи и избавимся от спама (но на старых статьях комменты будут все еще включены, для их отключения нужно будет зайти в каждую статью отдельно и убирать галочку комментариев).
2. Избавляемся от спама с помощью капчи:
а. Для этого выполняем пункт а в 1. Далее в "Настройках обсуждения" ставим галочки "Комментарий должен быть одобрен вручную" и ставим количество ссылок в "Модерация комментариев" равным единице. Таким образом, если появится комментарий с ссылкой, то он не опубликуется, а будет ждать вашего решения.
б. Теперь, чтобы избавиться от спам ботов поставьте плагин капчи - их много, но самые эффективные это: Google Captcha (reCAPTCHA) by BestWebSoft и Akismet.
Конечно, 2-й метод будет эффективным, но никто не запрещает пользователю (не боту) открыть любую вашу статью, пройти капчу и оставить спам текст с ссылками. А таких пользователй может быть очень много. Если Вы цените свое время и вам нужны только комментарии без обратных ссылок, то используйте 3-й способ.
3. Избавляемся от комментариев с ссылками:
Сначала, делаем все, что во 2-м пункте.
Затем открываем редактором файл:
/wp-includes/comment.php и ищем функцию: function wp_filter_comment($commentdata)
Ищем в ней строку:
$commentdata['comment_content'] = apply_filters('pre_comment_content', $commentdata['comment_content']);
И после нее ставим код, который будет искать ссылки в добавляемом комментарии. Как известно, все ссылки начинаются с http://, https:// или //, поэтому если в тексте будет найдено такое выражение, комментарий будет засчитан как спам:
$commentdata_test = str_replace(array("\r\n", "\r", "\n"), '', $commentdata['comment_content']);
$commentdata_test = preg_match("/(http|https|\/\/)\:\/\//",$commentdata_test);
if($commentdata_test == '1') { $commentdata['comment_content'] = "url_true_is_spam"; }
Далее ищем чуть выше функцию: function wp_insert_comment($commentdata) - она отвечает за добавление комментария в БД.
После строки:
$data = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_karma', 'comment_approved', 'comment_agent', 'comment_type', 'comment_parent', 'user_id');
Ставим код (он не пропусти комменты, содержащие ссылки в БД):
if($data['comment_content'] == 'url_true_is_spam') { return $id; }
Теперь, если пользователь оставит обычный комментарий без ссылок, то он добавится в БД и будет ждать вашего решения. А если он будет содержать ссылку, то проигнорируется движком.
Но здесь остался еще один момент. Если у вас в настройках включена опция уведомлений о новых комментариях, то при попытке отправки спама вам будут уходить автоматически пустые сообщения. Давайте их тоже настроим. В том же файле найдите функцию: function wp_new_comment( $commentdata ) и в ней замените сроку:
wp_notify_moderator($comment_ID);
на:
if($commentdata['comment_content'] != 'url_true_is_spam') { wp_notify_moderator($comment_ID); }
Теперь вам на почту будут приходить только комментарии от настоящих пользователей, а от спам ботов не проходить.
У меня все заработало, но некоторых вещей уже нет или они изменены. Например: строку if($data['comment_content'] == 'url_true_is_spam') { return $id; } я поставил сразу после $compacted = compact( 'comment_post_ID', 'comment_author', 'comment... Далее заменил return wp_notify_moderator( $comment_ID ); на if($commentdata['comment_content'] != 'url_true_is_spam') { return wp_notify_moderator($comment_ID); } Теперь все ОК - Автор большое спасибо! Теперь если идет спам, то он даже в базу не добавляется и не уидут уведомления на почту по 8 штук на день! ))