Categories: Wordpress

Запрет дубликатов при заполнении в поле формы CF7 – Contact Form 7

Источник: http://cfdbplugin.com/?page_id=904

Ситуация: Есть Пользователи, которые заполняют формы (плагин Contact Form 7), но вы не хотите, чтобы они имели возможность заполнять их несколько раз.

Решение: Добавить проверку в область формы, и запретить дубликаты в базе для одного из полей формы. Удобнее всего это делать для e-mail. В итоге, если пользователь вводит e-mail повторно – ему выдается сообщение об ошибке.

Хук запрета дубликатов для CF7

  1. Для работы этого хука у вас должны быть установлены следующие плагины:
  2. Скопировать название формы, и название поля формы, для которого нужно будет установить хук.
    В примере ниже это email_123
    <p>Your Name (required)<br />
        [text* name] </p>
     
    <p>Your Email (required)<br />
        [email* email_123] </p>
     
    <p>[submit "Send"]</p>
    
  3. Для создания проверки, нужно добавить фильтр. Для этого удобно пользоваться плагином Shortcodes Actions and Filters.
    Перейти, Инструменты -> Shortcodes Actions and Filters. Нажать Add new и вставить следующий код:
    /**
     * @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-й уже запретить.
Для этого в фильтр добавляется счетчик:

/**
 * @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. И так далее…

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 "Відправити"]

    • Ляна, где именно Вы установили код? проблема может быть в этом

Recent Posts

  • Excel

Как правильно открыть CSV с многострочными ячейками в Excel

Если при открытие csv файла с помощью excel У все поехали ячейки - это простой… Read More

% дней назад
  • Python

Загрузка проекта на Github и Автодеплой на сервер

Простые шаги как происходит Загрузка проекта на Github и Автодеплой на сервер Сделайте работу проще! Read More

% дней назад
  • Python
  • Полезная минутка

Миграция базы данных в проектах Python

Миграция базы данных - помогают с этим библиотеки SQLAlchemy и Alembic. Read More

% дней назад
  • Python

Команды Git – Шпаргалка по основным командам Git

Основные Команды Git, которые точно пригодятся. Сохрани себе шпаргалку Git Read More

% дней назад
  • Python

Установка PostgreSQL на сервер Ubuntu и подключение через pgAdmin

Установка PostgreSQL на сервер Read More

% дней назад
  • Полезная минутка

Как создать PrimaryKey для таблицы в PostgreSQL

Как создать PrimaryKey в талице базы данных SQL [РЕШЕНО] Ошибка relation tablename_id_seq doesn't exist Read More

% дней назад