Estoy usando un PHP desde aquí que envía un correo electrónico basado en una selección desplegable en el Formulario de contacto 7. Me gustaría que solo se ejecute y envíe el correo electrónico si una de las otras tres entradas es el número 10

Intenté combinar el interruptor con && y || operadores pero no se ejecuta según lo deseado. Estoy limitado por mi aprendizaje aquí, por lo que agradecería cualquier ayuda que pueda brindarme.

/ * interruptor de respuesta automática cf7 * /

Conéctese a wpcf7_mail_sent: esto sucederá después de enviar el formulario

Add_action ('wpcf7_mail_sent', 'contact_form_autoresponders');

Nuestra función de autorespondedores

function contact_form_autoresponders( $contact_form ) {

    if( $contact_form->id==14 ){ #your contact form ID - you can find this in contact form 7 settings

        #retrieve the details of the form/post
        $submission = WPCF7_Submission::get_instance();
        $posted_data = $submission->get_posted_data();                          

        #set autoresponders based on dropdown choice            
        switch( $posted_data['location'] ){ #your dropdown menu field name
                    case 'AB':
                    case 'AL':
                    case 'B':
                    case 'BA':
                    case 'BB':
                    case 'BD':
                    $msg="email a";
            break;

                case 'NW':
                case 'N':
                case 'E':
                case 'W':
                case 'SW':
                case 'SE':
                case 'WC':
                case 'EC':  
           ``` && if ( $posted_data['size1'] == 10 || $posted_data['size2'] == 10 || $posted_data['size3] == 10)  ```    
            $msg="email b";
            else $msg="email a";
            break;

        }


        #mail it to them
        mail( $posted_data['femail-610'], 'Thanks for your enquiry', $msg );
    }

}

Por lo tanto, esperaría que se envíe el correo electrónico 'A' si se selecciona alguno de los primeros casos del menú desplegable del formulario y el correo electrónico 'B' para enviar si se selecciona alguno de los casos secundarios, pero solo si uno de los tres tamaños es igual a 10 más envía correo electrónico 'A'.

0
FalsePozitive 10 may. 2019 a las 20:10

3 respuestas

La mejor respuesta

Probablemente debería usar in_array() para este tipo de comprobaciones .

Simplemente cambie su interruptor a una declaración if y defina 2 matrices con los valores con los que desea comparar.

$locationsForEmailA = ['AB', 'AL', 'B', 'BA', 'BB', 'BD'];
$locationsForEmailB = ['NW', 'N', 'E', 'W', 'SW', 'SE', 'WC', 'EC'];
if(in_array($posted_data['location'], $locationsForEmailA, true) || 
    in_array($posted_data['location'], $locationsForEmailB, true) && 
    !($posted_data['size1'] == 10 || $posted_data['size2'] == 10 || $posted_data['size3'] == 10)){
    $msg = "email a";
} else {
    $msg = "email b";
}
1
Dharman 10 may. 2019 a las 19:57

Un pequeño análisis de código:

....
case 'SE':
case 'WC':
case 'EC':  

Hasta aquí, el cambio es un OR (||) de las instrucciones de llamada case anteriores que comienzan desde su última break. Si cambia la siguiente parte a:

   if ( $posted_data['size1'] == 10 
        || $posted_data['size2'] == 10 
        || $posted_data['size3] == 10 )
   {
        $msg="email b";
   }

... entonces toda la condición if se ANDA a los casos anteriores ⇒ $msg="email b" solo se ejecuta, si al menos uno de los casos es válido AND lo siguiente si La condición es VERDADERA.

1
Wiimm 10 may. 2019 a las 17:59

Los interruptores simplemente no funcionan así.

Debe cambiar a un patrón if / else-if o usar un diccionario de búsqueda.

0
Louis Ingenthron 10 may. 2019 a las 17:17