Cum obții ID-ul postării curente în hook-ul de acțiune wpcf7_before_send_mail din Contact Form 7
Încerc să gestionez datele din CF7 înainte de trimitere și să actualizez un câmp personalizat al postării curente folosind funcția ACF, dar nu reușesc să obțin ID-ul postării din care a fost trimis formularul. Am încercat și să obțin ID-ul din variabila globală $post și din get_queried_object_id() dar nu a funcționat.
Are cineva vreo idee cum pot obține ID-ul postării din care a fost trimis formularul?
function dv_wpcf7_handle_form_data($wpcf7)
{
$submission = WPCF7_Submission::get_instance();
if ($submission) {
$posted_data = $submission->get_posted_data();
}
// Verifică ID-ul formularului WPCF7 specific
if ($wpcf7->id() == 128) {
$number_order = $posted_data['customer-number'];
$number_current_value = get_field('trip_available_seats', get_the_ID()); // transmiterea ID-ului către funcție nu funcționează
$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 = 'Mesaj de eroare...';
}
}
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;
}
Puteți obține ID-ul postului din variabila array $posted_data
din care a fost trimis formularul
if ($submission) {
$posted_data = $submission->get_posted_data();
print_r($posted_data)
}
Dacă faceți un print_r
pe aceasta, veți obține ceva de genul:
Array
(
[_wpcf7] => 20
[_wpcf7_version] => 5.1.6
[_wpcf7_locale] => en_US
[_wpcf7_unit_tag] => wpcf7-f20-p22-o1
[_wpcf7_container_post] => 22 **//Acesta este ceea ce căutați.**
[your-name] => Jon Doe
[your-email] => test@test.com
[your-subject] => subiect
[your-message] => mesaj
)
Edit:
Începând cu CF7 versiunea 5.2, modul corect de a obține ID-ul "postului" căruia îi este asociat formularul de contact este:
if ($submission) {
print_r($_POST);
}
Aceasta va returna ceva de genul:
Array
(
[_wpcf7] => 119 **//Acesta este ID-ul "formularului de contact". Dar acesta ar trebui obținut folosind metoda WPCF7_ContactForm::get_current(); **
[_wpcf7_version] => 5.2.1
[_wpcf7_locale] => en_US
[_wpcf7_unit_tag] => wpcf7-f119-p120-o1
[_wpcf7_container_post] => 120 **//Acesta este ID-ul "postului"**
[_wpcf7_posted_data_hash] =>
[your-name] => Jon
[your-email] => Doe
[your-subject] => Test
[your-message] => Test
)

Din cauza unei modificări majore în versiunea 5.2, get_posted_data
nu mai returnează nicio metadată. Consultați răspunsul alternativ de mai jos.

Din cauza unei modificări incompatibile cu versiunile anterioare în versiunea 5.2, nu mai puteți prelua metadatele formularului folosind get_posted_data()
.
În schimb, puteți utiliza valoarea id
din tabloul returnat de get_current()
:
$contact_form = WPCF7_ContactForm::get_current();
$contact_form_id = $contact_form -> id;

dacă preferi să obții valoarea din wpcf7 în loc de tabloul $_POST
, poți folosi următoarele. acest lucru este similar cu modul de obținere a datelor postate. doar folosește get_meta
în loc de get_posted_data
:
$submission = WPCF7_Submission :: get_instance();
$submission->get_meta('container_post_id');
