Вопрос или проблема
Я перезагружаю свою форму с помощью 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-кода. Давайте рассмотрим, как правильно настроить все компоненты вашей системы.
Шаги реализации
-
Слово о 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); } }); } });
-
Создание класса для обработки 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, сохраняя её функциональность и интеграцию с другими элементами вашего сайта.