Cambiar los valores del formulario CF7 dinámicamente

3 minutos de lectura

avatar de usuario
defensa

He estado intentando cambiar dinámicamente los campos del formulario CF7 sin usar Contact Form 7 Dynamic Text Extension. He visto un montón de artículos sobre cómo obtener datos publicados, pero no sobre cómo puedo sobrescribir los valores existentes. Mi objetivo es cambiar dinámicamente el archivo adjunto y agregar otros metadatos asociados con cada publicación. Se puede hacer esto? ¡Gracias!

Esto es lo que tengo hasta ahora:

function wpcf7_custom_before_send(&$cf7) {
    if ( $cf7->id == 4 ) {
        $submission = WPCF7_Submission::get_instance();
        if ( $submission ) {
            $data =& $submission->get_posted_data();
            // how do I overwrite posted data?
        }
    }
}
add_action("wpcf7_before_send_mail", "wpcf7_custom_before_send");

Puedes usar mi código para hacer esto. Algunas explicaciones para su código:

1) Desde identificación $cf7->id la propiedad ya no es accesible. Usa el método id() en su lugar $cf7->id().

2) No necesita uso & para devolución de llamada $cf7 y $submission. usar para esto return.

add_action("wpcf7_before_send_mail", "wpcf7_do_something");

function wpcf7_do_something($WPCF7_ContactForm)
{

    if (224 == $WPCF7_ContactForm->id()) {

        //Get current form
        $wpcf7      = WPCF7_ContactForm::get_current();

        // get current SUBMISSION instance
        $submission = WPCF7_Submission::get_instance();

        // Ok go forward
        if ($submission) {

            // get submission data
            $data = $submission->get_posted_data();

            // nothing's here... do nothing...
            if (empty($data))
                return;

            // extract posted data for example to get name and change it
            $name         = isset($data['your-name']) ? $data['your-name'] : "";

            // do some replacements in the cf7 email body
            $mail         = $wpcf7->prop('mail');

            // Find/replace the "[your-name]" tag as defined in your CF7 email body
            // and add changes name
            $mail['body'] = str_replace('[your-name]', $name . '-tester', $mail['body']);

            // Save the email body
            $wpcf7->set_properties(array(
                "mail" => $mail
            ));

            // return current cf7 instance
            return $wpcf7;
        }
    }
}

Eso es todo, cambiamos algunas etiquetas y enviamos un correo electrónico con la etiqueta modificada 😉

  • Volveré y lo marcaré como respuesta tan pronto como tenga la oportunidad de probarlo. He votado a favor por el momento. ¡Gracias!

    – Defensor de perros

    06/11/2014 a las 21:47

  • ¡Gracias! Esto me ayudó a decodificar algo de html antes de enviarlo.

    – ben

    18 de mayo de 2018 a las 5:56

  • Esto funciona bien para el correo electrónico, pero ¿qué pasa con los complementos como Flamingo que almacenan los campos de datos? Esos todavía aparecen sin modificar.

    – Tessa

    3 de julio de 2018 a las 13:45

  • ¿Cómo se puede cambiar el tema dinámicamente u obtener el tema publicado? por ejemplo, puedo ver que el contenido del correo electrónico es $mail['body']. que pasa con el tema

    – Karue Benson Karue

    1 de junio de 2020 a las 17:24

  • @KarueBensonKarue intenta ver lo que tienes en $mail['subject'] y luego cambiarlo como quieras.

    – Brotheryura

    3 de junio de 2020 a las 0:23

Como necesitaba modificar los receptores de formularios en función de los campos ACF, aquí hay una solución de copiar y pegar que se basa en el código @Brotheryura.

Le permite modificar el destinatario del correo electrónico de forma dinámica sin tener campos ocultos en la interfaz. Simplemente póngalo en sus plantillas functions.php y reemplace el $recipient = ... Parte con tu propia función o código para obtener el nuevo receptor.

add_action("wpcf7_before_send_mail", "wpcf7_change_recipient");
function wpcf7_change_recipient($WPCF7_ContactForm)
{
    $wpcf7      = WPCF7_ContactForm::get_current();
    $submission = WPCF7_Submission::get_instance();

    //some little magic to get the referers ID
    $recipient  = get_field('mail', url_to_postid(wp_get_referer()));

    if (!empty($recipient))
    {
        if ($submission)
        {
            $data = $submission->get_posted_data();

            // nothing's here... do nothing...
            if (empty($data))
                return;

            // do some replacements in the cf7 email body
            $mail              = $wpcf7->prop('mail');
            $mail['recipient'] = $recipient;

            // Save the email body
            $wpcf7->set_properties(array(
                "mail" => $mail
            ));

            // return current cf7 instance
            return $wpcf7;
        }
    }
}

¿Ha sido útil esta solución?