Загрузка шорткода через ajax
Я пытаюсь загрузить слайдшоу только при определенном размере экрана браузера - то есть, я не хочу, чтобы слайдшоу загружалось на маленьких, мобильных экранах. Плагин слайдшоу предоставляет шорткод:
<?php echo do_shortcode('[metaslider id="8302"]'); ?>
Но когда я пытаюсь загрузить его с помощью .load(), он просто выводит строку и не выполняет php.
Изучая этот вопрос, я нашел несколько похожих тем:
вызов шорткода в javascript Почему 'do_shortcode' плагина может не работать в AJAX запросе?
К сожалению, у меня недостаточно репутации, чтобы оставлять комментарии в этих темах, поэтому я создаю новый вопрос.
Не мог бы кто-нибудь объяснить это максимально простым языком для человека, который плохо знаком с PHP?
Вы не можете загружать файл напрямую таким образом:
$('.homepage__slider').load('wp-content/themes/mytheme/slider.php');
Также обратите внимание, что WordPress загружает jQuery в режиме noConflict, поэтому псевдоним $
не работает.
Если вы загружаете файл напрямую, ни одна из функций WordPress не будет работать. Вам следует использовать AJAX API, чтобы всё загружалось в контексте WordPress.
Вам нужно обернуть ваш PHP-код обработки в функцию:
function my_ajax_shortcode_wpse_108874() {
echo do_shortcode('[metaslider id="8302"]');
die;
}
Подключите эту функцию к системе AJAX:
add_action('wp_ajax_my_ajax_shortcode', 'my_ajax_shortcode_wpse_108874()');
add_action('wp_ajax_nopriv_my_ajax_shortcode', 'my_ajax_shortcode_wpse_108874()');
Отправьте запрос на http://site/wp-admin/admin-ajax.php
и передайте my_ajax_shortcode
как аргумент, когда JavaScript делает запрос.
var data = {
action: 'my_ajax_shortcode'
};
jQuery.post(ajax_url, data, function(response) {
// здесь выполните необходимые действия; возможно, ничего не требуется
});
Вы можете установить ajax_url
аналогично этому примеру из Codex:
add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
if( 'index.php' != $hook ) return; // Только для панели dashboard
wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
// в JavaScript свойства объекта доступны как ajax_object.ajax_url, ajax_object.we_value
wp_localize_script( 'ajax-script', 'ajax_object',
array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => 1234 ) );
}

Спасибо за подробный пост. Я, честно говоря, не очень силен в PHP и JavaScript, поэтому, хотя ваше объяснение выглядит весьма исчерпывающим, для меня оно не слишком понятно. Мне почти удалось заставить это работать — слайд-шоу загружается, но работает с глюками. Как будто оно не загружает все необходимые ресурсы для правильной работы (изображения неправильного размера, элементы, которые должны быть скрыты, остаются видимыми и т.д.). Я пробовал вручную добавлять JavaScript и CSS плагина, но безрезультатно.

Похоже, дело не в ресурсах — если я загружаю две версии слайдера на одной странице (этим способом и обычным способом через шорткод, чтобы все ресурсы точно загрузились), ajax-версия все равно работает некорректно.

Если быть точнее, ajax-версия выводит кучу HTML-кода в слайде, которого нет в обычной версии через шорткод. Включая div'ы с классами thumbnail, delete slide, поля ввода для подписей и т.д. — почти как будто это админская версия слайда.
