Ситуация: Есть Пользователи, которые заполняют формы (плагин Contact Form 7), но вы не хотите, чтобы они имели возможность заполнять их несколько раз.
Решение: Добавить проверку в область формы, и запретить дубликаты в базе для одного из полей формы. Удобнее всего это делать для e-mail. В итоге, если пользователь вводит e-mail повторно – ему выдается сообщение об ошибке.
<p>Your Name (required)<br />
[text* name] </p>
<p>Your Email (required)<br />
[email* email_123] </p>
<p>[submit "Send"]</p>
/**
* @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:
Note: Название формы и название email поля должны быть уникальными и не повторяться в других формах, иначе будет путаница.
Бывают случаи, когда запрет дубликатов должен быть, но при этом должно быть разрешено более, чем одно совпадение. Например, нужно пропустить 5 одинаковых мейлов, а 6-й уже запретить.
Для этого в фильтр добавляется счетчик:
/**
* @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); В этом коде дополнительно еще нужно внести изменения в строку:
if ($counter>4) // цифра счетчика
Цифра 4 говорит о том, что фильтр пропустит 5 одинаковых мейлов. Если нужно, например, пропуситить 3 мейла, тогда измените цифру 4 на 2. И так далее…
Если при открытие csv файла с помощью excel У все поехали ячейки - это простой… Read More
Простые шаги как происходит Загрузка проекта на Github и Автодеплой на сервер Сделайте работу проще! Read More
Миграция базы данных - помогают с этим библиотеки SQLAlchemy и Alembic. Read More
Основные Команды Git, которые точно пригодятся. Сохрани себе шпаргалку Git Read More
Установка PostgreSQL на сервер Read More
Как создать PrimaryKey в талице базы данных SQL [РЕШЕНО] Ошибка relation tablename_id_seq doesn't exist Read More
View Comments
Добрый день!
Подскажите пожалуйста, установлен код, для запрета дублирования 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 "Відправити"]
Ляна, где именно Вы установили код? проблема может быть в этом