Как получить ID текущей записи в хуке wpcf7_before_send_mail плагина Contact Form 7

16 дек. 2019 г., 13:17:29
Просмотры: 21.7K
Голосов: 6

Я пытаюсь обработать данные CF7 перед отправкой и обновить произвольное поле текущей записи используя функцию ACF, но не могу получить ID текущей записи, с которой отправляется форма. Я также пробовал получить ID через глобальную переменную $post и функцию get_queried_object_id(), но это тоже не сработало.

Есть ли идеи, как можно получить ID записи, с которой была отправлена форма?

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

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

    // Проверка ID конкретной формы WPCF7
    if ($wpcf7->id() == 128) {
        $number_order = $posted_data['customer-number'];
        $number_current_value = get_field('trip_available_seats', get_the_ID()); // передача ID в функцию не работает
        $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 = 'Сообщение об ошибке...';
        }
    }

    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
Все ответы на вопрос 4
2

Вы можете получить ID записи из массива $posted_data, который отправляется формой:

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

Если выполнить print_r для этого массива, вы получите что-то вроде:

Array
(
    [_wpcf7] => 20
    [_wpcf7_version] => 5.1.6
    [_wpcf7_locale] => en_US
    [_wpcf7_unit_tag] => wpcf7-f20-p22-o1
    [_wpcf7_container_post] => 22  **//Это то, что вам нужно.**
    [your-name] => Jon Doe
    [your-email] => test@test.com
    [your-subject] => subject
    [your-message] => message
)

Обновление:

Начиная с версии 5.2 CF7 правильный способ получения ID "записи", к которой привязана контактная форма:

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

Это вернет что-то вроде:

Array
(
    [_wpcf7] => 119 **//Это ID "контактной формы". Но его лучше получать через метод WPCF7_ContactForm::get_current(); **
    [_wpcf7_version] => 5.2.1
    [_wpcf7_locale] => en_US
    [_wpcf7_unit_tag] => wpcf7-f119-p120-o1
    [_wpcf7_container_post] => 120 **//Это ID "записи"**
    [_wpcf7_posted_data_hash] => 
    [your-name] => Jon
    [your-email] => Doe
    [your-subject] => Test
    [your-message] => Test
)
16 дек. 2019 г. 14:03:11
Комментарии

Из-за критического изменения в версии 5.2, функция get_posted_data больше не возвращает метаданные. Смотрите альтернативное решение ниже.

Pikamander2 Pikamander2
18 июл. 2020 г. 10:36:23

Верно. Начиная с версии 5.2, get_posted_data не возвращает все поля, я обновил свой ответ.

Awais Awais
16 авг. 2020 г. 04:20:54
1

Из-за изменения, нарушающего обратную совместимость в версии 5.2, вы больше не можете получать метаданные формы с помощью функции get_posted_data().

Вместо этого вы можете использовать значение id из массива, возвращаемого функцией get_current():

$contact_form = WPCF7_ContactForm::get_current();
$contact_form_id = $contact_form -> id;
18 июл. 2020 г. 10:35:12
Комментарии

Это вернет ID формы, а не ID "поста", о котором спрашивал автор.

Awais Awais
16 авг. 2020 г. 04:19:14
1

Узнал, что можно получить ID контейнерного поста с помощью $_POST['_wpcf7_container_post'])

16 дек. 2019 г. 13:55:12
Комментарии

отлично работает из functions.php

Iggy Iggy
11 янв. 2020 г. 22:51:33
0

Если вы предпочитаете получать значение из wpcf7 вместо массива $_POST, можно использовать следующий подход. Это похоже на получение отправленных данных, но вместо get_posted_data используйте get_meta:

$submission = WPCF7_Submission :: get_instance();
$submission->get_meta('container_post_id');
2 окт. 2020 г. 13:22:00