Cómo obtener el ID de la entrada actual en el hook de acción wpcf7_before_send_mail de Contact Form 7
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;
}
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
)

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.

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;

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');
