Загрузите форму Gravity через AJAX, используя do_shortcode

Вопрос или проблема

Я перезагружаю свою форму с помощью ajax после подтверждения.

Это работает отлично, и я передаю свой form_id в функцию действия без проблем…

// код для запуска действий, когда формы были отправлены
$(document).on('gform_confirmation_loaded', function(event, form_id){

    // выполняем код для формы редактора белой метки
    if(form_id == 12) {

        // перезагружаем нашу форму
        $.ajax({
            cache: false,
            timeout: 30000,
            url: admin_ajax_url,
            type: 'GET',
            data: {
                action   : 'gf_reload_editor_form',
                post_id  : post_id,
                form_id  : form_id,
                isAjax   : true
            },
            success: function (data) {

                // удаляем старую подтвержденную форму
                $('#gform_ajax_wrapper_'+form_id).remove();

                // загружаем форму в редактор нашего сайта
                $('#site_editor').prepend(data);

            }
        });

    }

});

Вышеуказанный код работает отлично.

Проблема заключается в перезагрузке формы с помощью do_shortcode.

class WhiteLabel
{

    public function __construct()
    {

        // действия для перезагрузки формы ajax
        add_action('wp_ajax_nopriv_gf_reload_editor_form', [ $this, 'gf_reload_editor_form' ], 20 );
        add_action('wp_ajax_gf_reload_editor_form', [ $this, 'gf_reload_editor_form' ], 20 );

    }

    public function gf_reload_editor_form ()
    {
        // получаем id формы
        $form_id = $_GET['form_id'];

        // выполняем шорткод для вывода gravity формы
        echo do_shortcode('[gravityform id="'.$form_id.'" title="false" description="false" ajax="true" update]');

        die();

    }
}

new WhiteLabel();

Хорошо, всё выше выглядит отлично, потому что это так. Я протестировал другие свои пользовательские функции do_shortcode, и они выводятся нормально.

Проблема заключается в do_shortcode('[gravityform ... ]')

Вы, вероятно, спрашиваете, почему я просто не использую функцию php gravity_form()

gravity_form( $form_id, false, false, false, '', true );

Это тоже работает отлично! Это перезагружает идеально работающую ajax форму.

Проблема заключается в том, что мне нужно использовать do_shortcode, потому что мне нужно включить свойство update. Свойство update не может быть использовано с функцией php gravity_form().

Свойство update вводится с помощью плагина Gravity Forms: Post Update, который позволяет моей форме обновлять текущий пост, а не создавать новый.

Это заставило меня задуматься: когда я загружаю форму, используя тот же метод do_shortcode при первоначальной загрузке страницы, я использую do_shortcode внутри цикла. Так форма должна знать, какие данные поста получать и предварительно заполнять мои поля формы и т. д.

Итак, я попробовал это…

public function gf_reload_editor_form ()
{

    // получаем id поста и устанавливаем данные поста
    $post_id = $_GET['post_id'];
    $post = get_post($post_id);
    setup_postdata($post);

    // получаем id формы
    $form_id = $_GET['form_id'];

    // выполняем шорткод для вывода gravity формы
    echo do_shortcode('[gravityform id="'.$form_id.'" title="false" description="false" ajax="true" update]');

    die();

}

.. думая, что do_shortcode может считать, что он внутри цикла. Но всё равно это тоже не сработало.

Любые идеи были бы отличными, спасибо, так как я застрял.

Единственный способ, которым я смог разобраться, как заставить do_shortcode работать, это с помощью WP_Query.

<?php

// получаем текущий сайт
$args = [
    'p'          => $post_id,
    'post_type'  => 'any'
];

// запрос wp сайта
$oSite = new WP_Query($args);

?>

<?php if ( $oSite->have_posts() ): ?>

    <?php while($oSite->have_posts()): $oSite->the_post() ?>

        <div id="gform_ajax_wrapper_<?=$form_id?>">
            <?=do_shortcode('[gravityform id="'.$form_id.'" title="false" description="false" ajax="true" update]')?>
        </div>

    <?php endwhile; ?>

<?php else: ?>

    Сайт не найден. <?=$post_id?>

<?php endif; ?>

Ответ или решение

Чтобы перезагрузить форму Gravity Forms с помощью Ajax, используя функция do_shortcode, важно учитывать специфику вашей реализации и JavaScript-кода. Давайте рассмотрим, как правильно настроить все компоненты вашей системы.

Шаги реализации

  1. Слово о JavaScript: У вас уже есть JavaScript, который обрабатывает событие gform_confirmation_loaded. Он правильно вызывает Ajax-запросы и удаляет старую форму, что является отличным началом.

    $(document).on('gform_confirmation_loaded', function(event, form_id){
       if(form_id == 12) {
           $.ajax({
               cache: false,
               timeout: 30000,
               url: admin_ajax_url,
               type: 'GET',
               data: {
                   action   : 'gf_reload_editor_form',
                   post_id  : post_id,
                   form_id  : form_id,
                   isAjax   : true
               },
               success: function (data) {
                   $('#gform_ajax_wrapper_'+form_id).remove();
                   $('#site_editor').prepend(data);
               }
           });
       }
    });
  2. Создание класса для обработки Ajax-запросов: Вы уже создали класс WhiteLabel, который добавляет обработчики действий для Ajax. Однако, важно учитывать, что форма нуждается в правильных данных поста, чтобы отобразить данные корректно.

    class WhiteLabel {
       public function __construct() {
           add_action('wp_ajax_nopriv_gf_reload_editor_form', [ $this, 'gf_reload_editor_form' ], 20 );
           add_action('wp_ajax_gf_reload_editor_form', [ $this, 'gf_reload_editor_form' ], 20 );
       }
    
       public function gf_reload_editor_form() {
           // Получаем ID поста
           $post_id = intval($_GET['post_id']);
           $post = get_post($post_id);
           setup_postdata($post);
    
           // Получаем ID формы
           $form_id = intval($_GET['form_id']);
    
           // Выводим форму с помощью do_shortcode
           echo do_shortcode('[gravityform id="'.$form_id.'" title="false" description="false" ajax="true" update]');
    
           wp_reset_postdata(); // Не забываем сбросить данные поста
           die();
       }
    }
    
    new WhiteLabel();

Примечания по коду

  • Проверка наличия поста: Важно убедиться, что пост с переданным ID существует, прежде чем передавать его в setup_postdata. Вы можете добавить проверку существования:

    if(!$post) {
       echo 'Пост не найден.';
       die();
    }
  • Сброс данных поста: В конце функции не забудьте сбросить глобальные данные поста с помощью wp_reset_postdata(). Это позволяет избежать потенциальных проблем с глобальной переменной $post.

  • Использование intval: Обеспечьте безопасность вашего кода, используя intval() для получения числовых параметров. Это предотвращает XSS-атаки.

Заключение

Ваш итоговый код позволит корректно перезагрузить форму Gravity Forms с помощью Ajax, и при этом использует do_shortcode, чтобы эффективно применить свойства, доступные только через шорткод, такие как update. Убедитесь, что все используемые плагины, особенно Gravity Forms и другие, актуальны, чтобы избежать совместимых проблем.

Следуя этим рекомендациям, вы сможете успешно реализовать загрузку формы с помощью Ajax, сохраняя её функциональность и интеграцию с другими элементами вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...