Как сделать свое сообщение после отправки contact form 7?

Рейтинг: 0Ответов: 2Опубликовано: 13.04.2023

сделал создание записи на фронте через плагин 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 ]);
}

Ответы

▲ 0Принят

Если вы используете чекбоксы с атрибутом 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 будет содержать массив значений, выбранных пользователем в чекбоксах.

▲ 0

Чтобы отправить 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.