WordPress AJAX пагинация с query_posts
У меня есть список чекбоксов категорий, которые при выборе используют admin-ajax.php WordPress для фильтрации записей по выбранной категории.
Все работает отлично, но у меня не получается обновить пагинацию. Я использую query_posts следующим образом:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args= array
(
'post_type'=>'course',
'paged'=>$paged,
'posts_per_page'=>3,
'tax_query' => array(
array(
'taxonomy' => 'subject',
'field' => 'slug',
'terms' => $tags_from_group
)
)
);
$posts=query_posts( $args);
Затем я возвращаю $posts как данные, но не знаю, как получить обновленную пагинацию...
Я думал о чем-то вроде этого:
$pagedposts=array();
$pagedposts['posts']=$posts;
$pagedposts['pagination']=???
Таким образом, $pagedposts['pagination'] будет содержать данные, необходимые для обновления старой пагинации после успешного AJAX-запроса...
Я нашел, что у кого-то была такая же проблема здесь, но там нет решения...
В итоге я обнаружил, что обновить пагинацию невозможно. Способ, которым я загружал следующие посты, заключался в установке смещения постов (post offset) и использовании кнопки "Загрузить еще".
Таким образом, в вашем AJAX-запросе, где вы загружаете дополнительные посты, необходимо передавать значение смещения (offset):
$.ajax({
url: '/wp-admin/admin-ajax.php',
type: "POST",
data: {
'action': 'filter_posts',
'selected_options':selected_options,
'offset':postoffset
}//и т.д...
Поскольку это значение смещения будет постоянно меняться, вам нужно сохранить его в переменной. В примере выше я использовал 'postoffset'.
Определить значение смещения довольно просто. Вы можете использовать jQuery для подсчета количества постов, уже отображенных на странице:
var postoffset = $('.hentry').length;
Где .hentry — это название класса моих постов.
Как только вы получите смещение постов в вашем PHP-скрипте, вы можете установить его следующим образом:
$args= array
(
'offset'=>$offset,
'post_type'=>$post_type,
'paged'=>$paged,
'posts_per_page'=>9,
'orderby' => 'title',
'order' => 'ASC'
);
Затем подставьте это в ваш query_args (помимо определения смещения выше, я добавил параметр 'posts_per_page', который позволяет мне четко видеть, что загружаются дополнительные 9 постов, а смещение увеличивается на 9 каждый раз):
$posts=query_posts( $args);
Чтобы настроить кнопку "Загрузить еще" вместо пагинации, вы можете просто добавить div или картинку на страницу и присвоить ей ID, например:
<div id="load-more">ЗАГРУЗИТЬ ЕЩЕ </div>
и jQuery:
function load_more_button_listener($){
$('#load-more').click(function(event){
event.preventDefault();
var postoffset = $('.hentry').length;
// console.log("offset: "+postoffset);
//вызываем оригинальную AJAX-функцию для загрузки дополнительных постов с новым смещением:
load_more_posts($,postoffset);
});
}
