Cum obții ID-ul postării curente în hook-ul de acțiune wpcf7_before_send_mail din Contact Form 7

16 dec. 2019, 13:17:29
Vizualizări: 21.7K
Voturi: 6

Î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;
}
0
Toate răspunsurile la întrebare 4
2

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
)
16 dec. 2019 14:03:11
Comentarii

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.

Pikamander2 Pikamander2
18 iul. 2020 10:36:23

Așa este. Începând cu versiunea 5.2, get_posted_data nu mai returnează toate câmpurile, am actualizat răspunsul meu.

Awais Awais
16 aug. 2020 04:20:54
1

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;
18 iul. 2020 10:35:12
Comentarii

Aceasta ar returna ID-ul formularului, nu ID-ul "postării" pe care l-a întrebat OP.

Awais Awais
16 aug. 2020 04:19:14
1

Aflați că puteți obține ID-ul postului container cu $_POST['_wpcf7_container_post'])

16 dec. 2019 13:55:12
Comentarii

funcționează perfect din functions.php

Iggy Iggy
11 ian. 2020 22:51:33
0

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');
2 oct. 2020 13:22:00