WordPress AJAX пагинация с query_posts

7 нояб. 2013 г., 12:22:11
Просмотры: 14K
Голосов: 5

У меня есть список чекбоксов категорий, которые при выборе используют 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-запроса...

Я нашел, что у кого-то была такая же проблема здесь, но там нет решения...

0
Все ответы на вопрос 1
0

В итоге я обнаружил, что обновить пагинацию невозможно. Способ, которым я загружал следующие посты, заключался в установке смещения постов (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);
 });  
}
11 дек. 2013 г. 00:36:25