Я, наверное как и многие, стал жертвой спама, который лился через плагин wordpress “contact form 7”
С одной стороны без этого плагина никуда, а с другой – такое кол-во спама (до 20 писем в день).
Я пробовал и капчу ставить и вопросы в стиле 5+5=?, но ничего не помогало. Решение в конечном итоге нашлось.
Суть описываемого способа проста.
Как работают спам боты?
Они делают запрос через HTTP соединение и отправляют данные.
При таких запросах боты не обрабатывают скрипты и не нажимают кнопку отправить.
Этим мы и воспользуемся.
Сделаем так, чтобы при нажатии кнопки отправить заполнялось невидимое для пользователя поле.
У пользователя (в браузере) будет отрабатывать javascript, а у спамбота – не будет.
А потом будем проверять так заполнено это поле или нет.
Для этого нам понадобиться ftp доступ и блокнот.
- В админке открываем форму и добавляем поле “[text* antispam]”
Это обязательное текстовое поле.
“antispam” – имя поля. Рекомендую дать этому полю свое имя.
Имя этого поля будет использоваться и в дальнейшем.
Если измените его имя – поменяйте везде! - Открываем стили. И там добавляем
.antispam {
display:none;
}
Это нужно для того, чтобы пользователь не видел этого поля. - Тут зависит от версии. Не знаю с какой версии они убрали функцию “beforeSerialize”. Но если Вы не нашли этой функции – переходите к плану б.
а) Для старых версий. Открываем файл “\wp-content\plugins\contact-form-7\includes\js\scripts.js”
И добавляем в функцию “beforeSerialize: function($form, options) {” следующую строку:1$form.find('input[name="antispam"]').val('nospam');б) Для новых версий. Открываем файл “\wp-content\plugins\contact-form-7\includes\js\scripts.js”.
И добавляем в функцию “wpcf7.submit = function( form ) {” после строки “var $form = $( form );” следующую строку:1$form.find('input[name="antispam"]').val('nospam');Тут antispam – имя поля, которое мы обозначили в п.1.
‘nospam’ – наше кодовое слово, которое мы будем дальше проверять.
Тоже рекомендую его изменить. - В функции темы добавляем следующий код:
123456789add_filter( 'wpcf7_validate_text*', 'custom_text_validation_filter', 20, 2 );function custom_text_validation_filter( $result, $tag ) {$spam_text = isset( $_POST['antispam'] ) ? trim( $_POST['antispam'] ) : '';if ( $spam_text != 'nospam' ) {$result->invalidate( $tag, "Spam?" );}return $result;}
Готово. Спам больше не приходит.