Como evitar correos duplicados en Contact Form 7

En este post ampliaremos la funcionalidad de Contact Form 7 de WordPress filtrando correos que ya han rellenado el formulario.
Como evitar envío correos y otros campos duplicados en Contact Form 7
Redactor:
Konstantin
Publicado
06/01/2023

Contact Form 7 tiene una gran multitud de usos y herramientas a disposición de los desarrolladores web para crear el formulario perfecto. En este caso explicaré de como como evitar correos duplicados en Contact Form 7 implementando vuestra propia función. 

Insertamos la función para detectar correos duplicados en Contact Form 7

Lo necesario para aplicar este tutorial es tener el Contact Form instalado en tu WordPress y tu formulario ya creado y tener el plugin instalado. 

Los creadores de esta función se han basado en la funcionalidad de core del propio  Contact Form 7 Custom Validation

Plugin necesario 

El código del plugin necesario par poder usar la función de filtro y detectar si el correo de tu contact form 7 en concreto el Contact form 7 to Database Extension nos abre la posibilidad de tener una gestión de base de datos de nuestros leads. Gracias a ello vamos a poder tener un registro de usuarios que hayan rellenado nuestro formulario para quedar guardados en el sistema. 

En el caso de que ya tengamos instalada la extensión nos iremos a el archivo de funciones de nuestra tema en:

  • /wp-content/themes/NOMBRE-TEMPLATE/functions.php

Para que este código te funcione tienes que aplicar cambios relativos a tu formulario para recoger el campo que se quiera validar. Lo que tendrás que modificar es el campo de nombre del formulario de Contact Form 7 y el campo que recoge el Mail (Ej: “mail”) en el formulario.

Para evitar correos duplicados en Contact Form 7 los campos a modificar son:

  • $formName – Por el nombre de tu formulario
  • $fieldName – Nombre de tu campo de correo
  • $errorMessage – Edita el mensaje error que aparecerá en el formulario
				
					/**
 * @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 = 'Nombre del Formulario'; // Cambia por el nombre de tu formulario 
    $fieldName = 'email_123'; // Cambia por el campo name de tu correo
    $errorMessage = 'Este correo ya esta inscrito'; // Cambia por tu mensaje de error
    $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*', 'my_validate_email', 10, 2);
				
			

Ya podemos empezar a hacer cambios para detectar correos duplicados en Contact Form 7. Recuerda tener descargado e instalado el modulo para que se guarden los registros e implementado el código de arriba. 

Fuente del código 

Validar mas de un campo para detectar correos duplicados en Contact Form 7

Si queremos comprobar que un usuario no haya metido otro campo a parte del mail recogido por Contact Form 7 de WordPress como por ejemplo el campo de DNI o Pasaporte entonces tendremos que añadir otra funcion para el validador.

				
					/**
 * Añadimos el campo de DNI como ejemplo para verificar
 */
function my_validate_dni($result, $tag) {
    $formName = 'Nombre del Formulario'; // Cambia por el nombre de tu formulario 
    $fieldName = 'dni'; // Cambia por tu otro campo a validar (Puede ser texto)
    $errorMessage = 'Este correo ya esta inscrito'; // Cambia por tu mensaje de error
    $name = $tag['name'];
    if ($name == $fieldName) {
        if (is_already_submitted($formName, $fieldName, $_POST[$name])) {
            $result->invalidate($tag, $errorMessage);
        }
    }
    return $result;
}
 

				
			

Recuerden añadir al final de todas vuestras funciones de validación sus filtros. En caso de indicar el campo de DNI en el validador se quedarían de esta manera.

				
					add_filter('wpcf7_validate_email*', 'my_validate_email', 10, 2); 
add_filter('wpcf7_validate_text*', 'my_validate_dni', 10, 2);
				
			

Deja una respuesta

Tu dirección de correo electrónico no será publicada.