Как проверить, существует ли электронное письмо, отправленное через контактную форму 7, в моей базе данных?

Когда клиент отправляет электронную почту через контактную форму 7, как мне проверить, существует ли электронная почта в моей базе данных, и изменить сообщение уведомления на «Ваша электронная почта уже существует в нашей базе данных»

До сих пор я пытался использовать хук before_send, но когда я нажимаю кнопку «Отправить», страница просто зависает и нет подтверждающего сообщения.

Ниже приведена функция, которая у меня есть в файле functions.php.

add_action( 'wpcf7_before_send_mail', 'check_email' );

function check_email( $cf7 )
{
$email = $cf7->posted_data["email"];
if($email == 'Is in our database'){
echo ('Your email exists in our database');
}
}

Спасибо за вашу помощь


person muzemuze    schedule 08.04.2015    source источник


Ответы (2)


Я добавил фильтр при проверке:

add_filter( 'wpcf7_validate', 'email_already_in_db', 10, 2 );

function email_already_in_db ( $result, $tags ) {
    // retrieve the posted email
    $form  = WPCF7_Submission::get_instance();
    $email = $form->get_posted_data('your-email');
    // if already in database, invalidate
    if( email_exists( $email ) ) // email_exists is a WP function
        $result->invalidate('your-email', 'Your email exists in our database');
    // return the filtered value
    return $result;
}

В этом случае поле электронной почты называется your-email.

Функция email_exists — это родная функция WP, которая справляется с этим.

person d79    schedule 08.04.2015
comment
Спасибо .. Это сработало, но не совсем так, как я хотел, мой вопрос был не очень ясен. В итоге я использовал этот пример ссылка, которая не сначала работал, пока не обновил свой cf7 - person muzemuze; 09.04.2015
comment
К сожалению, плагин Contact Form 7 не предлагает много хуков для использования, и я думаю, что это наиболее близкое решение, которое вы можете получить (на данный момент, возможно, в следующих версиях...). Поэтому, если этот ответ решил ваш вопрос, рассмотрите возможность принятия его, нажав на галочку. Это указывает более широкому сообществу, что вы нашли решение, и повышает репутацию как отвечающего, так и вас самих. Нет никаких обязательств делать это. - person d79; 09.04.2015
comment
Этот ответ хорош только в том случае, если электронная почта предназначена для зарегистрированного пользователя. Это не следует проверять, потому что контактная форма 7 (на мой взгляд) в основном используется для незарегистрированных клиентов, таких как лиды. - person Spencer Shattuck; 13.07.2019
comment
этот ответ просто прекрасен, ссылка, указанная в первом комментарии, относится к веб-сайту cf7 и, как обычно, представляет собой краткий пример, который предполагает наличие предварительно зарегистрированного сообщения об ошибке. Кроме того, @muzemuze не совсем ясно, какую базу электронных писем нужно проверять. - person Aurovrata; 31.10.2019

Вот решение, которое у меня работает с плагином Advanced Contact form 7 DB

function email_already_in_db ( $result, $tags ) {
    // Retrieve the posted form
    $form  = WPCF7_Submission::get_instance();
    $form_posted_data = $form->get_posted_data();

    // Get the field name that we want to check for duplicates.
    // I added 'unique' to the beginning of the field name in CF7
    // Checking for that with preg_grep
    $unique_field_name = preg_grep("/unique(\w+)/", array_keys($form_posted_data));

    // $unique_field_name comes back as array so the next three lines give us the key as a string
    reset($unique_field_name);
    $first_key = key($unique_field_name);
    $unique_field_name = $unique_field_name[$first_key];

    // Check the form submission unique field vs what is already in the database
    $email = $form->get_posted_data($unique_field_name);
    global $wpdb;
    $entry = $wpdb->get_results( "SELECT * FROM wp_cf7_vdata_entry WHERE name LIKE '$unique_field_name' AND value='$email'" );

    // If already in database, invalidate
    if (!empty($entry)) {
      $result->invalidate($field_name, 'Your email: '.$email.' already exists in our database.');
      }
    // return the filtered value
  return $result;
}
person Spencer Shattuck    schedule 15.07.2019