Intereting Posts
Как проверить категорию персонализированного типа сообщения или нет Структура пользовательского типа и таксономии Удалите всех пользователей, которые назвали: user_avatar $ wpdb-> insert () и значения для столбцов Datetime? Почему WordPress использует «вложение» в строку запроса пользовательского типа сообщения? Как создать простую страницу архива в сообщениях и добавить URL-адрес add_menu_page () с переменной функцией Использование переходных процессов в сочетании с memcached Главная страница / Статическая страница Просмотр страниц посетителей после этого следует ограничить Добавить запрос arg для довольно постоянных ссылок в WordPress Сделать некоторые ссылки, созданные из функции wp_nav-menu unclickeable? JQuery нужно определить в <head>, но Gravity Forms определяет его в <footer> Как я могу обратиться к существующей категории? Многоэкранный вывод мультимедийного менеджера WordPress Метод jQuery post в меню администратора

Ajax Pagination на фильтре Ajax

Следуя этому замечательному учебному пособию, я выполнил разбивку на страницы Ajax с помощью прокрутки: https://www.billerickson.net/infinite-scroll-in-wordpress/ .

Теперь я добавил второй вызов Ajax, чтобы отфильтровать сообщения по категориям, и я хотел бы сделать pagination также для фильтрованных сообщений.

Поэтому я решил сделать что-то подобное в функции filter_posts () в functions.php:

function filter_posts() { global $wp_query; $args['category_name'] = $_POST['passed_slug_via_ajax']; query_posts($args); [loop] wp_send_json_success( $data ); }; 

Я думал, что таким образом, т.е. используя query_posts , текущий запрос global $wp_query; был изменен, чтобы включить фильтр $args['category_name'] , поэтому, когда я запускаю функцию «больше сообщений», она будет разбивать на страницы отфильтрованные результаты:

 // more posts" function function more_posts() { global $wp_query; $args['paged'] = $_POST['passed_page_via_ajax']; query_posts($args); [loop] wp_send_json_success( $data ); }; 

Ни в коем случае: функция tiggered more_posts() не применяет фильтр …

Поэтому я попытался вручную изменить global $wp_query; таким образом, в функции filter_posts() :

 function filter_posts() { global $wp_query; $args['category_name'] = $_POST['passed_slug_via_ajax']; query_posts($args); [loop] $wp_query->set( "category_name", $_POST['passed_slug_via_ajax'] ); wp_send_json_success( $data ); }; 

Но это не работает …

Возможно, я не понял, как global $wp_query; оно работает?

Как блестяще отметил @Milo, в WordPress нет такой вещи, как глобальный объект запроса.

Поэтому я решил проблему через JS, например:

  var isFiltered = false; var filters; $(load_more_button).click(function(e) { load_more_handler(e); }); $(filters_form).submit(function(e) { filter_handler(e); }); function filter_handler(e) { isFiltered = true; filters = $(this).serialize(); var data = { action: 'ajax_filter', query: php_vars.query, // // query is got from wp_localize_script() filters: filters }; $.post(php_vars.adminAjaxUrl, data, function(res) { [etc] }; function load_more_handler(e) { var data = { action: 'ajax_load_more', query: php_vars.query, // query is got from wp_localize_script() page: page, isFiltered: isFiltered, filters: filters }; $.post(php_vars.adminAjaxUrl, data, function(res) { [etc] }; 

и в functions.php что-то вроде:

 function ajax_load_more_posts() { $args = isset( $_POST['query'] ) ? array_map( 'esc_attr', $_POST['query'] ) : array(); if( isset($_POST['isFiltered']) && ( $_POST['isFiltered'] ) ) { $filters = $_POST['filters']; $args = wp_parse_args(get_ajax_filters($filters), $args); // get_ajax_filters() is a custom utility function of mine to combine filters passed by Ajax and $args }; [loop] wp_die(); } ; add_action( 'wp_ajax_ajax_load_more', 'ajax_load_more_posts' ); add_action( 'wp_ajax_nopriv_ajax_load_more', 'ajax_load_more_posts' );