Как получить текущий идентификатор сообщения в контактной форме 7 wpcf7 перед отправкой действия по перехвату почты
Я пытаюсь обработать данные CF7 перед отправкой и обновить текущее пользовательское поле записи с помощью функции ACF, но я не могу получить текущий идентификатор записи, с которого отправляется форма. Я также пытался получить идентификатор из глобальной переменной $post и get_queried_object_id(), но это тоже не сработало.
Есть идеи, как я могу получить идентификатор сообщения, с которого была отправлена форма?
function dv_wpcf7_handle_form_data($wpcf7)
{
$submission = WPCF7_Submission::get_instance();
if ($submission) {
$posted_data = $submission->get_posted_data();
}
// Check for ID of specific WPCF7 form
if ($wpcf7->id() == 128) {
$number_order = $posted_data['customer-number'];
$number_current_value = get_field('trip_available_seats', get_the_ID()); // passing the ID to function doesn't work
$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 = 'Error message...';
}
}
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;
}
4 answers
Из-за обратно несовместимого изменения в версии 5.2 вы больше не можете извлекать метаданные формы с помощью get_posted_data()
.
Вместо этого вы можете использовать значение id
в массиве, возвращаемом get_current()
:
$contact_form = WPCF7_ContactForm::get_current();
$contact_form_id = $contact_form -> id;
Выяснил, что вы можете получить идентификатор почтового контейнера с помощью $_POST['_wpcf7_container_post'])
Вы можете получить идентификатор записи из переменной массива $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 **//This is what you want.**
[your-name] => Jon Doe
[your-email] => [email protected]
[your-subject] => subject
[your-message] => message
)
Изменить:
Начиная с CF7 версии 5.2 правильный способ получить идентификатор "post", к которому привязана контактная форма:
if ($submission) {
print_r($_POST);
}
Это вернуло бы что-то вроде этого:
Array
(
[_wpcf7] => 119 **//This is the "contact form" ID. But one should get that using WPCF7_ContactForm::get_current(); method **
[_wpcf7_version] => 5.2.1
[_wpcf7_locale] => en_US
[_wpcf7_unit_tag] => wpcf7-f119-p120-o1
[_wpcf7_container_post] => 120 **//This is the "post" ID**
[_wpcf7_posted_data_hash] =>
[your-name] => Jon
[your-email] => Doe
[your-subject] => Test
[your-message] => Test
)
Если вы предпочитаете извлекать значение из wpcf7 вместо массива $_POST
, вы можете использовать следующее. это похоже на то, как получить опубликованные данные. просто используйте get_meta
вместо get_posted_data
:
$submission = WPCF7_Submission :: get_instance();
$submission->get_meta('container_post_id');