Недавно понадобилось защитить сайт от спама в форму обратной связи от Contact Form 7 для WordPress. Простая математическая капча не спасала, а рекапчу ставить не хотелось (тем более ее уже тоже пробивают).
При защите от спама я исходил из того, что бот не исполняет javascript, хотя это не совсем так, есть например Zennoposter, однако мое решение в первую очередь от ковровых бомбардировок, а не от точечных ударов поэтому задача сводилась к тому, чтоб создать поле без которого Contact Form 7 не отправляло бы форму, и оперировать его значением с помощью JS при отправке реальных пользователях.
Самым лучшим мне показалось использовать чекбокс — или в простонародье галочку. Логика работы галочки необычная — форма отправляется только если галочка снята, при этом дефолтное состояние галочки — checked. То есть если заходит бот он
- ничего сделает данному полю (если он его не знает)
- сделает ее checked
т.е. в результате галочка будет checked и форма не отправится, и спам соответственно тоже.
Если же заходит браузер исполняющий JS, то галочка снимается через JS и форма отправляется.
Реализация:
1. Создаем в Contact Form 7 чекбокс
1 |
[acceptance agree class:agree default:on invert] |
acceptance — собственно сам чекбокс
default:on — по умолчанию checked
class:agree — class=»agree»
invert — отправлять форму только если checked снят
2. Убираем чекбоксу видимость через CSS
1 |
.agree {display:none} |
3. Снимаем галочку через JS
1 2 3 |
<script language="javascript"> jQuery('.agree').prop('checked', false); </script> |
или на нативном JS
1 2 3 4 5 6 7 |
<script language="javascript"> var x = document.getElementsByClassName("agree"); var i; for (i = 0; i < x.length; i++) { x[i].checked = false; } </script> |
Скрипт нужно поместить ниже чем чекбокс, и лучше всего обернуть его document.ready.
Это собственно и всё. Защитить Contact Form 7 от спама как видите — несложно, сложнее было придумать логику, а делов по реализации — на 15 минут.
Вставлять надо не в файл плагина, а в шаблон сайта.
для тех кто плохо разбирается, то
Админка сайта — Внешний вид — Редактор
п.2. Таблица стилей (style.css)
п.3. Основной шаблон (index.php), перед закрывающим тегом
У меня получилось следующим образом:
п.2 Вставил в кастомный css в редакторе темы
п.3 Вставил в футер.php
как «обернуть его document.ready» ?
$( document ).ready(function() {
// тут код
});