Как сделать свое сообщение после отправки contact form 7?
сделал создание записи на фронте через плагин CF7. Встал вопрос на который я не нашел решения, хотя вроде бы просто. Как мне взять id созданного поста и отправить в тексте после успешной отправки формы? Пытался шарить файлы самой CF7, но так и не вышло. Если просто в модалке прописать $post_id тоже не выходит. Подскажите куда смотреть или как делать? Подозреваю что надо как-то сделать через ajax? но как тогда брать post_id с functions.php ?
function created_post_in_cf7( $contact_form ) {
$title = $_POST['company-title'] && ! empty( $_POST['company-title'] ) ? sanitize_text_field( $_POST['company-title'] ) : '';
$product = $_POST['company-product'] && ! empty( $_POST['company-product'] ) ? wp_strip_all_tags( $_POST['company-product'] ) : '';
$video = $_POST['company-video'] && ! empty( $_POST['company-video'] ) ? sanitize_text_field( $_POST['company-video'] ) : '';
$stoimost = $_POST['company-stoimost'] && ! empty( $_POST['company-stoimost'] ) ? wp_strip_all_tags( $_POST['company-stoimost'] ) : '';
$budjet = $_POST['company-budjet'] && ! empty( $_POST['company-budjet'] ) ? sanitize_text_field( $_POST['company-budjet'] ) : '';
$datastart = $_POST['company-data-start'] && ! empty( $_POST['company-data-start'] ) ? wp_strip_all_tags( $_POST['company-data-start'] ) : '';
$dataend = $_POST['company-data-end'] && ! empty( $_POST['company-data-end'] ) ? sanitize_text_field( $_POST['company-data-end'] ) : '';
$tematiki_kanalov = $_POST['$tematiki_kanalov'] && ! empty( $_POST['$tematiki_kanalov'] ) ? sanitize_text_field( $_POST['$tematiki_kanalov'] ) : '';
$ars = [
'post_type' => 'company',
'post_title' => $title,
'post_status' => 'pending',
'meta_input' => [
'product' => $product,
'video' => $video,
'tematiki_kanalov' => $tematiki_kanalov,
'stoimost' => $stoimost,
'bjudzhet' => $budjet ,
'data_nachala' => $datastart,
'data_konca' => $dataend,
'status' => 'obrabotka', ],
];
$post_id = wp_insert_post( $ars );
$mail = $contact_form->prop('mail');
if ( false !== $post_id ) {
$mail['subject'] = $mail['subject'] .' Создана запись №'. $post_id;
}
$contact_form->set_properties(['mail' => $mail ]);
}
Ответы (3 шт):
Чтобы отправить ID созданной записи в тексте после успешной отправки формы Contact Form 7, вы можете изменить функцию created_post_in_cf7() следующим образом, чтобы использовать AJAX для передачи ID созданной записи:
Добавьте следующий код в ваш файл functions.php:
add_action( 'wp_ajax_created_post_in_cf7', 'created_post_in_cf7' );
add_action( 'wp_ajax_nopriv_created_post_in_cf7', 'created_post_in_cf7' );
function created_post_in_cf7() {
$title = $_POST['company-title'] && ! empty( $_POST['company-title'] ) ? sanitize_text_field( $_POST['company-title'] ) : '';
$product = $_POST['company-product'] && ! empty( $_POST['company-product'] ) ? wp_strip_all_tags( $_POST['company-product'] ) : '';
$video = $_POST['company-video'] && ! empty( $_POST['company-video'] ) ? sanitize_text_field( $_POST['company-video'] ) : '';
$stoimost = $_POST['company-stoimost'] && ! empty( $_POST['company-stoimost'] ) ? wp_strip_all_tags( $_POST['company-stoimost'] ) : '';
$budjet = $_POST['company-budjet'] && ! empty( $_POST['company-budjet'] ) ? sanitize_text_field( $_POST['company-budjet'] ) : '';
$datastart = $_POST['company-data-start'] && ! empty( $_POST['company-data-start'] ) ? wp_strip_all_tags( $_POST['company-data-start'] ) : '';
$dataend = $_POST['company-data-end'] && ! empty( $_POST['company-data-end'] ) ? sanitize_text_field( $_POST['company-data-end'] ) : '';
$tematiki_kanalov = $_POST['$tematiki_kanalov'] && ! empty( $_POST['$tematiki_kanalov'] ) ? sanitize_text_field( $_POST['$tematiki_kanalov'] ) : '';
$ars = [
'post_type' => 'company',
'post_title' => $title,
'post_status' => 'pending',
'meta_input' => [
'product' => $product,
'video' => $video,
'tematiki_kanalov' => $tematiki_kanalov,
'stoimost' => $stoimost,
'bjudzhet' => $budjet ,
'data_nachala' => $datastart,
'data_konca' => $dataend,
'status' => 'obrabotka', ],
];
$post_id = wp_insert_post( $ars );
if ( false !== $post_id ) {
echo $post_id;
}
wp_die();
}
В вашем файле functions.php добавьте следующий код, чтобы зарегистрировать AJAX скрипт и передать post_id в JavaScript:
add_action('wp_enqueue_scripts', 'add_custom_script');
function add_custom_script() {
wp_enqueue_script('custom-script', get_stylesheet_directory_uri() . '/custom-script.js', array('jquery'), '1.0', true);
wp_localize_script('custom-script', 'my_ajax_object', array('ajax_url' => admin_url('admin-ajax.php')));
}
add_action('wp_ajax_my_custom_action', 'my_custom_action');
add_action('wp_ajax_nopriv_my_custom_action', 'my_custom_action');
function my_custom_action() {
$post_id = $_POST['post_id'];
// выполните нужные действия с $post_id
wp_die();
}
Создайте файл custom-script.js в вашей теме и добавьте следующий код:
document.addEventListener( 'wpcf7mailsent', function( event ) {
var response = event.detail.apiResponse;
if (response.status === 'mail_sent') {
var post_id = response.into.querySelector('#post_id').value;
jQuery.post(my_ajax_object.ajax_url, {
action: 'my_custom_action',
post_id: post_id
});
}
}, false );
В форме CF7 добавьте скрытое поле для post_id:
<input type="hidden" name="post_id" id="post_id" value="" />
Теперь, после отправки формы, post_id будет передан в JavaScript через AJAX, и вы можете выполнить нужные действия с этим post_id.
Если вы используете чекбоксы с атрибутом name="tematiki_kanalov[]", то при отправке формы данные будут отправляться в виде массива, а не строки. Поэтому вы можете использовать функцию wp_unslash() вместо sanitize_text_field() для получения значения чекбоксов в виде массива. Также, убедитесь, что вы правильно обращаетесь к атрибуту name в $_POST массиве и что у вас нет опечаток в нем.
Измените строку
$tematiki_kanalov = $_POST['$tematiki_kanalov'] && ! empty( $_POST['$tematiki_kanalov'] ) ? sanitize_text_field( $_POST['$tematiki_kanalov'] ) : '';
на
$tematiki_kanalov = isset( $_POST['tematiki_kanalov'] ) ? wp_unslash( $_POST['tematiki_kanalov'] ) : '';
Теперь $tematiki_kanalov будет содержать массив значений, выбранных пользователем в чекбоксах.
Для исправления ошибки "TypeError: response.into.querySelector is not a function" необходимо изменить следующую строку в коде JavaScript:
var post_id = response.into.querySelector('#post_id').value;
на
var post_id = document.querySelector('#post_id').value;
Это связано с тем, что свойство into в объекте apiResponse не содержит метода querySelector, поэтому нужно использовать стандартный метод document.querySelector для выбора элемента с id="post_id".
Что касается вопроса о передаче значений checkbox в PHP, то вы должны использовать массив для их обработки, поэтому вам необходимо изменить строку в коде PHP следующим образом:
$tematiki_kanalov = isset( $_POST['tematiki_kanalov'] ) && ! empty( $_POST['tematiki_kanalov'] ) ? array_map( 'sanitize_text_field', $_POST['tematiki_kanalov'] ) : '';
Таким образом, вы проверяете, установлено ли значение для $_POST['tematiki_kanalov'], и затем используете функцию array_map для обработки всех выбранных значений checkbox и передачи их в переменную $tematiki_kanalov в виде массива.