Загрузка шорткода через ajax

3 авг. 2013 г., 21:13:27
Просмотры: 22.2K
Голосов: 3

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

<?php echo do_shortcode('[metaslider id="8302"]'); ?>

Но когда я пытаюсь загрузить его с помощью .load(), он просто выводит строку и не выполняет php.

Изучая этот вопрос, я нашел несколько похожих тем:

вызов шорткода в javascript Почему 'do_shortcode' плагина может не работать в AJAX запросе?

К сожалению, у меня недостаточно репутации, чтобы оставлять комментарии в этих темах, поэтому я создаю новый вопрос.

Не мог бы кто-нибудь объяснить это максимально простым языком для человека, который плохо знаком с PHP?

2
Комментарии

Что именно вы пытаетесь загрузить с помощью .load()? Пожалуйста, опубликуйте весь соответствующий код.

s_ha_dum s_ha_dum
3 авг. 2013 г. 21:32:16

Когда я пытаюсь загрузить php-файл, содержащий приведённый выше код ( <?php echo do_shortcode('[metaslider id="8302"]'); ?> )

Вот так: $('.homepage__slider').load('wp-content/themes/mytheme/slider.php');

Don't Wake Me Up Don't Wake Me Up
3 авг. 2013 г. 21:49:10
Все ответы на вопрос 1
4

Вы не можете загружать файл напрямую таким образом:

$('.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 ) );
}
3 авг. 2013 г. 23:18:56
Комментарии

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

Don't Wake Me Up Don't Wake Me Up
4 авг. 2013 г. 12:05:40

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

Don't Wake Me Up Don't Wake Me Up
4 авг. 2013 г. 12:10:40

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

Don't Wake Me Up Don't Wake Me Up
4 авг. 2013 г. 12:28:51

Если существует "админ" версия слайд-шоу и она загружается, вам нужно найти код, который это контролирует. Предполагаю, что он загружает что-то другое при is_admin() === true, но все AJAX API запросы являются "админскими".

s_ha_dum s_ha_dum
4 авг. 2013 г. 18:43:55