Источник: http://cfdbplugin.com/?page_id=904
Ситуация: Есть Пользователи, которые заполняют формы (плагин Contact Form 7), но вы не хотите, чтобы они имели возможность заполнять их несколько раз.
Решение: Добавить проверку в область формы, и запретить дубликаты в базе для одного из полей формы. Удобнее всего это делать для e-mail. В итоге, если пользователь вводит e-mail повторно — ему выдается сообщение об ошибке.
Хук запрета дубликатов для CF7
- Для работы этого хука у вас должны быть установлены следующие плагины:
-
Скопировать название формы, и название поля формы, для которого нужно будет установить хук.
В примере ниже это email_123
1234567<p>Your Name (required)<br />[text* name] </p><p>Your Email (required)<br />[email* email_123] </p><p>[submit "Send"]</p> -
Для создания проверки, нужно добавить фильтр. Для этого удобно пользоваться плагином Shortcodes Actions and Filters.
Перейти, Инструменты -> Shortcodes Actions and Filters. Нажать Add new и вставить следующий код:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748/*** @param $formName string* @param $fieldName string* @param $fieldValue string* @return bool*/function is_already_submitted($formName, $fieldName, $fieldValue) {require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php');$exp = new CFDBFormIterator();$atts = array();$atts['show'] = $fieldName;$atts['filter'] = "$fieldName=$fieldValue";$atts['unbuffered'] = 'true';$exp->export($formName, $atts);$found = false;while ($row = $exp->nextRow()) {$found = true;}return $found;}/*** @param $result WPCF7_Validation* @param $tag array* @return WPCF7_Validation*/function my_validate_email($result, $tag) {$formName = 'email_form'; // Измение название формы$fieldName = 'email_123'; // Измените название поля e-mail$errorMessage = 'Вы превысили количество регисраций с одного e-mail'; // Измените сообщение об ошибке$name = $tag['name'];if ($name == $fieldName) {if (is_already_submitted($formName, $fieldName, $_POST[$name])) {$result->invalidate($tag, $errorMessage);}}return $result;}// используйте следующую строку если поле **email** является обязательным в формеadd_filter('wpcf7_validate_email*', 'my_validate_email', 10, 2);// используйте следующую строку если поле **email** является НЕобязательным в формеadd_filter('wpcf7_validate_email', 'my_validate_email', 10, 2);// используйте следующую строку если поле **text** является обязательным в формеadd_filter('wpcf7_validate_text*', 'my_validate_email', 10, 2);// используйте следующую строку если поле **text** является НЕобязательным в формеadd_filter('wpcf7_validate_text', 'my_validate_email', 10, 2);В этом коде нужно будет следать изменения в my_validate_email function:
- Изменить название формы для $formName
- Изменить название email поля для $fieldName
- Написать текст, который будет поялвяться при наличии дубликатов $errorMessage
Note: Название формы и название email поля должны быть уникальными и не повторяться в других формах, иначе будет путаница.
Разрешено более, чем одно совпадение
Бывают случаи, когда запрет дубликатов должен быть, но при этом должно быть разрешено более, чем одно совпадение. Например, нужно пропустить 5 одинаковых мейлов, а 6-й уже запретить.
Для этого в фильтр добавляется счетчик:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/** * @param $formName string * @param $fieldName string * @param $fieldValue string * @return bool */ function is_already_submitted($formName, $fieldName, $fieldValue) { $counter=0; require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php'); $exp = new CFDBFormIterator(); $atts = array(); $atts['show'] = $fieldName; $atts['filter'] = "$fieldName=$fieldValue"; $atts['unbuffered'] = 'true'; $exp->export($formName, $atts); $found = false; while ($row = $exp->nextRow()) { $counter++; if ($counter>4) // цифра счетчика. { $found = true; } } return $found; } /** * @param $result WPCF7_Validation * @param $tag array * @return WPCF7_Validation */ function my_validate_email($result, $tag) { $formName = 'email_form'; // Измение название формы $fieldName = 'email_123'; // Измените название поля e-mail $errorMessage = 'Вы превысили количество регисраций с одного e-mail'; // Измените сообщение об ошибке $name = $tag['name']; if ($name == $fieldName) { if (is_already_submitted($formName, $fieldName, $_POST[$name])) { $result->invalidate($tag, $errorMessage); } } return $result; } // используйте следующую строку если поле **email** является обязательным в форме add_filter('wpcf7_validate_email*', 'my_validate_email', 10, 2); // используйте следующую строку если поле **email** является НЕобязательным в форме add_filter('wpcf7_validate_email', 'my_validate_email', 10, 2); // используйте следующую строку если поле **text** является обязательным в форме add_filter('wpcf7_validate_text*', 'my_validate_email', 10, 2); // используйте следующую строку если поле **text** является НЕобязательным в форме add_filter('wpcf7_validate_text', 'my_validate_email', 10, 2); |
В этом коде дополнительно еще нужно внести изменения в строку:
1 |
if ($counter>4) // цифра счетчика |
Цифра 4 говорит о том, что фильтр пропустит 5 одинаковых мейлов. Если нужно, например, пропуситить 3 мейла, тогда измените цифру 4 на 2. И так далее…
Добрый день!
Подскажите пожалуйста, установлен код, для запрета дублирования url, но при отправке ничего не происходит, письма не отправляются, в чем может быть причина.
Вот код
function is_already_submitted($formName, $fieldName, $fieldValue) {
require_once(ABSPATH . ‘wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php’);
$exp = new CFDBFormIterator();
$atts = array();
$atts[‘show’] = $fieldName;
$atts[‘filter’] = «$fieldName=$fieldValue»;
$atts[‘unbuffered’] = ‘true’;
$exp->export($formName, $atts);
$found = false;
while ($row = $exp->nextRow()) {
$found = true;
}
return $found;
}
/**
* @param $result WPCF7_Validation
* @param $tag array
* @return WPCF7_Validation
*/
function my_validate_email($result, $tag) {
$formName = ’email’; // Change to name of the form containing this field
$fieldName = ‘url-83’; // Change to your form’s unique field name
$errorMessage = ‘Email has already been submitted’; // Change to your error message
$name = $tag[‘name’];
if ($name == $fieldName) {
if (is_already_submitted($formName, $fieldName, $_POST[$name])) {
$result->invalidate($tag, $errorMessage);
}
}
return $result;
}
add_filter(‘wpcf7_validate_url’, ‘my_validate_url’, 10, 2);
Вот форма
Ваше ім’я (обов’язково)
[text* your-name]
url
[url url-83]
Тема
[text your-subject]
Ваше повідомлення
[textarea your-message]
[submit «Відправити»]
Ляна, где именно Вы установили код? проблема может быть в этом