Ограничить отправку пользователя до одного на пользователя с помощью пользовательской контактной формы ответа 7

#php #wordpress #contact-form-7

#php #wordpress #contact-form-7

Вопрос:

Я работаю над многоязычным сайтом конкурса, на котором пользователям разрешено регистрироваться только один раз. Я использую контактную форму 7 с плагином CFDB. Используя приведенный ниже код, предоставленный автором CFDB, эта функция проверяет, отправлена ли форма уже;

 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;
}
 

наряду со следующим кодом, который проверяет форму, чтобы убедиться, что нет дубликатов электронной почты (именно так я намерен обнаруживать повторяющихся пользователей)

 function one_user_per_contest($result, $tag) {
    $formName = array('Contest Form', 'Contest form ES'); // This is the form name for English and spanish
    $fieldName = 'your-email'; // Name of the field to validate, which is the email field
    $errorMessage = "you've signed up already"; // 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_email*', 'one_user_per_contest', 20, 2);
 

Эта проверка работает нормально, поскольку не допускает дублирования электронной почты, но проблема, с которой я столкнулся, и я хотел бы получить некоторые указания, заключается в том, что я хочу, чтобы сообщение об ошибке отображалось в качестве ответа. вместо ответа One or more fields have an error. Please check and try again. я хочу, чтобы он сказал you've signed up already [см. Изображение ниже];

Результат пользовательского ответа

Спасибо

Комментарии:

1. Где строка ‘Одно или несколько полей содержат ошибку. Пожалуйста, проверьте и повторите попытку. «откуда, точно? Вы искали это? Ах, вероятно, из проверки контактной формы 7.. Взлом заключался бы в замене строки на JavaScript :-/

2. Вы проверили, вызывается ли ваша функция one_user_per_contest(), и достигнуты ли первое и второе if?

3. Функция invalidate передает invalidate->invalid_fields массив с ‘reason’ в качестве ключа. См. contact-form-7/includes/validation.php

4. @jasie В «Одном или нескольких полях есть ошибка. Пожалуйста, проверьте и попробуйте еще раз.» является ли сообщение по умолчанию CF7 «Произошли ошибки проверки», и да, функция one_user_per_contest () работает, просто не отображает сообщение в качестве ответа (чего я и хочу добиться)

5. @HowardE В этом примере тег $необходим для предотвращения отправки формы. я не уверен, как записать это в массив после проверки contact-form-7/includes/validation.php строка 7 (т.е. строка public function __construct)