En este post ampliaremos la funcionalidad de Contact Form 7 de WordPress filtrando correos que ya han rellenado el formulario.
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.
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
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.
Tambien puedes descargar el plugin desde aquí
En el caso de que ya tengamos instalada la extensión nos iremos a el archivo de funciones de nuestra tema en:
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:
/**
* @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.
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);
Buena información pero lamentablemente no es lo que busco.
Si tienes alguna duda comentamelo. Un saludo.