Cómo obtener el ID de la entrada actual en el hook de acción wpcf7_before_send_mail de Contact Form 7

16 dic 2019, 13:17:29
Vistas: 21.7K
Votos: 6

Estoy tratando de manejar los datos de CF7 antes del envío y actualizar el campo personalizado de la entrada actual usando la función ACF, pero no puedo obtener el ID de la entrada actual desde donde se envía el formulario. También he intentado obtener el ID desde la variable global $post y get_queried_object_id() pero tampoco funcionó.

¿Alguna idea de cómo puedo obtener el ID de la entrada desde donde se envió el formulario?

function dv_wpcf7_handle_form_data($wpcf7)
{
    $submission = WPCF7_Submission::get_instance();

    if ($submission) {
        $posted_data = $submission->get_posted_data();
    }

    // Verificar el ID del formulario específico de WPCF7
    if ($wpcf7->id() == 128) {
        $number_order = $posted_data['customer-number'];
        $number_current_value = get_field('trip_available_seats', get_the_ID()); // pasar el ID a la función no funciona
        $number_new_value = $number_current_value - $number_order;

        if ($number_new_value >= 0) {
            update_field('trip_available_seats', $number_new_value, get_the_ID());
        } else {
            $error = true;
            $err_msg = 'Mensaje de error...';
        }
    }

    if (isset($error) && $error === true) {
        $msgs = $wpcf7->prop('messages');
        $msgs['mail_sent_ok'] = $err_msg;
        $wpcf7->set_properties(array('messages' => $msgs));
        add_filter('wpcf7_skip_mail', 'abort_mail_sending');
    }

    return $wpcf7;
}
add_action('wpcf7_before_send_mail', 'dv_wpcf7_handle_form_data');

function abort_mail_sending($contact_form)
{
    return true;
}
0
Todas las respuestas a la pregunta 4
2

Puedes obtener el ID del post desde la variable array $posted_data del formulario enviado

  if ($submission) {
       $posted_data = $submission->get_posted_data();
       print_r($posted_data)
  }

Si haces un print_r obtendrás algo como esto:

Array
(
    [_wpcf7] => 20
    [_wpcf7_version] => 5.1.6
    [_wpcf7_locale] => en_US
    [_wpcf7_unit_tag] => wpcf7-f20-p22-o1
    [_wpcf7_container_post] => 22  **//Esto es lo que necesitas.**
    [your-name] => Jon Doe
    [your-email] => test@test.com
    [your-subject] => subject
    [your-message] => message
)

Edición:

Desde la versión 5.2 de CF7, la forma correcta de obtener el ID del "post" al que está vinculado el formulario de contacto es:

if ($submission) {
    print_r($_POST);
}

Eso retornaría algo como esto:

Array
(
    [_wpcf7] => 119 **//Este es el ID del "formulario de contacto". Pero se debería obtener usando el método WPCF7_ContactForm::get_current(); **
    [_wpcf7_version] => 5.2.1
    [_wpcf7_locale] => en_US
    [_wpcf7_unit_tag] => wpcf7-f119-p120-o1
    [_wpcf7_container_post] => 120 **//Este es el ID del "post"**
    [_wpcf7_posted_data_hash] => 
    [your-name] => Jon
    [your-email] => Doe
    [your-subject] => Test
    [your-message] => Test
)
16 dic 2019 14:03:11
Comentarios

Debido a un cambio importante en la versión 5.2, get_posted_data ya no devuelve ningún metadato. Consulta la respuesta alternativa a continuación.

Pikamander2 Pikamander2
18 jul 2020 10:36:23

Así es. Desde la versión 5.2 get_posted_data no devuelve todos los campos, he actualizado mi respuesta.

Awais Awais
16 ago 2020 04:20:54
1

Debido a un cambio incompatible con versiones anteriores en la versión 5.2, ya no puedes recuperar los metadatos del formulario usando get_posted_data().

En su lugar, puedes usar el valor id en el array devuelto por get_current():

$contact_form = WPCF7_ContactForm::get_current();
$contact_form_id = $contact_form -> id;
18 jul 2020 10:35:12
Comentarios

Eso devolvería el ID del formulario, no el ID del "post" que el OP ha preguntado.

Awais Awais
16 ago 2020 04:19:14
1

Descubrí que puedes obtener el ID de la publicación contenedora con $_POST['_wpcf7_container_post'])

16 dic 2019 13:55:12
Comentarios

funciona perfectamente desde functions.php

Iggy Iggy
11 ene 2020 22:51:33
0

Si prefieres recuperar el valor desde wpcf7 en lugar del array $_POST, puedes usar lo siguiente. Esto es similar a cómo recuperar los datos enviados. Solo usa get_meta en lugar de get_posted_data:

$submission = WPCF7_Submission :: get_instance();
$submission->get_meta('container_post_id');
2 oct 2020 13:22:00