Formulario de contacto 7 enviar validación fallida

5 minutos de lectura

avatar de usuario
charliek

Necesito el Formulario de contacto 7 para enviar un correo electrónico cuando se haya realizado la validación. ha fallado. Luego, envíe el correo electrónico CF7 normal cuando el formulario se envíe correctamente. ridiculo lo se pero clientela!

Creo que estoy relativamente cerca con lo siguiente:

function send_failed_vaildation_email( $data ) {
    $messagesend = 'Name:' . $_POST['your-name']; 
    $messagesend .= '\r\nEmail:' .$_POST['email']; 
    $messagesend .= '\r\nPhone:' .$_POST['validPhone']; 
    $messagesend .= '\r\nRate:' .$_POST['rate']; 
    $messagesend .= '\r\nBased:' .$_POST['based']; 
    wp_mail('c******y@gmail.com', 'failed validation mail', $messagesend );
}
add_filter("wpcf7_posted_data", "send_failed_vaildation_email");

Sin embargo, esto envía todos los envíos sin importar si pasan o fallan la validación.

wpcf7_before_send_mail no es bueno ya que solo se dispara una vez que el envío pasa la validación.

Estoy buscando un gancho diferente para usar en lugar de wpcf7_posted_data que solo se activa cuando falla la validación o una declaración if que puedo colocar alrededor wp_mail por el mismo efecto.

Gracias por adelantado

  • Este es uno de los requisitos de proyecto más extraños que he escuchado en mucho tiempo…

    – rnevio

    5 de marzo de 2015 a las 10:57

  • @rnevius ¡SÍ! Realmente no podía creer lo que preguntaban, pero tienen (lo que creen que es) una razón válida para capturar los datos.

    – charliek

    5 de marzo de 2015 a las 11:05

Así es como logré hacerlo funcionar.

La respuesta de @rnevius estaba fallando porque el wpcf7_posted_data El filtro se aplica antes de validar los datos, por lo que nada es inválido en ese momento.

Combinando la respuesta de @rnevius con la wpcf7_submit filtro y funciona como se esperaba.

Código completo:

function send_failed_vaildation_email() {
    $submission = WPCF7_Submission::get_instance();
    $invalid_fields = $submission->get_invalid_fields();

    $posted_data = $submission->get_posted_data();

    if ( !empty( $invalid_fields ) ) {
        $messagesend = 'Name:' . $posted_data['your-name']; 
        $messagesend .= '\r\nEmail:' . $posted_data['email']; 
        $messagesend .= '\r\nPhone:' . $posted_data['validPhone']; 
        $messagesend .= '\r\nRate:'  . $posted_data['rate']; 
        $messagesend .= '\r\nBased:' . $posted_data['based']; 
        $messagesend .= count($invalid_fields); 
        wp_mail('c*******y@gmail.com', 'failed validation mail', $messagesend );
    }
}
add_filter("wpcf7_submit", "send_failed_vaildation_email");

  • Asegúrate de marcar esto como correcto, cuando tengas la oportunidad. 🙂

    – rnevio

    6 de marzo de 2015 a las 15:11

avatar de usuario
nevio

Esto no ha sido probado, pero estoy bastante seguro de que necesitará conectarse al get_invalid_fields() instancia. Algo como:

function send_failed_vaildation_email() {
    $submission = WPCF7_Submission::get_instance();
    $invalid_fields = $submission->get_invalid_fields();

    $posted_data = $submission->get_posted_data();

    if ( !empty( $invalid_fields ) ) {
        $messagesend = 'Name:' . $posted_data['your-name']; 
        $messagesend .= '\r\nEmail:' . $posted_data['email']; 
        $messagesend .= '\r\nPhone:' . $posted_data['validPhone']; 
        $messagesend .= '\r\nRate:'  . $posted_data['rate']; 
        $messagesend .= '\r\nBased:' . $posted_data['based']; 
        wp_mail('c******y@gmail.com', 'failed validation mail', $messagesend );
    }
}
add_filter("wpcf7_posted_data", "send_failed_vaildation_email");

Puedes ver el proceso de envío del formulario en el seguimiento del complemento.

EDITAR: También acabo de notar la 'wpcf7_validation_error' enganchar contacto-formulario.php… Eso puede ser todo lo que necesita, ya que solo se activa cuando hay un error.

  • Gracias por investigar esto, desafortunadamente ninguno de los dos métodos funciona… get_invalid_fields() El método hace que el formulario se cuelgue al enviar; no se realiza ninguna validación/envío. wpcf7_validation_error permite que el formulario se valide pero no se envía ningún correo electrónico.

    – charliek

    5 de marzo de 2015 a las 11:42

  • Cuando probó el segundo método, ¿lo usó con su código original? ¿O mis cambios anteriores? También deberías intentar enviar una prueba wp_mail() con contenido de prueba, dentro wpcf7_validation_error. Otra cosa… CF7 valida a través de JS, así como PHP…

    – rnevio

    5 de marzo de 2015 a las 12:19

  • Lo siento, acabo de volver a investigar esto. Para el wpcf7_validation_error método Usé mi código original sin alegría. Luego lo probé con su código modificado y aún así no funcionó, lo cual sabía que no sucedería. Como sugirió, también lo probó con una prueba wp_mail(), de nuevo sin suerte (¡puedes ver un patrón!). Estoy evitando hacerlo a través de JS, ya que creo que el cliente solicitará que se transfieran los datos a una base de datos una vez que comiencen a recibir innumerables correos electrónicos basura. Ho hum, siento que nos estamos acercando, seguiré jugando e informaré cualquier cosa que encuentre.

    – charliek

    6 de marzo de 2015 a las 12:27

  • Estoy más cerca de encontrar el problema – $submission->get_invalid_fields() siempre devuelve 0, incluso si hay campos no válidos, lo que obviamente significa que if ( !empty( $invalid_fields ) ) declaración no se está disparando. Me puse en contacto con el desarrollador de CF7 en los foros de WP para ver si puede ayudar.

    – charliek

    6 de marzo de 2015 a las 14:06

  • ¿Y la validación no se realiza a través de JS?

    – rnevio

    6 de marzo de 2015 a las 14:22

CÓDIGO ACTUALIZADO PARA EL ÚLTIMO FORMULARIO DE CONTACTO 7

function is_gmail($email) {  
if(substr($email, -10) == '@gmail.com') {  
   return true;  
} else {  
   return false;  
};  
};  

function custom_email_validation_filter($result, $tag) {  
$tag = new WPCF7_Shortcode( $tag );
if ( 'your-email' == $tag->name ) {
    $the_value = isset( $_POST['your-email'] ) ? trim( $_POST['your-email'] ) : '';
    if(!is_gmail($the_value)){  
             $result->invalidate( $tag, "Are you sure this is the correct address?" );
   };  
 };  
 return $result;  
};  


add_filter('wpcf7_validate_email','custom_email_validation_filter', 20, 2); // Email field  
add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 20, 2); // Required Em

¿Ha sido útil esta solución?