web-dev-qa-db-fra.com

WordPress AJAX Pagination avec query_posts

J'ai une liste de catégories de cases à cocher qui, lorsqu'elles sont cochées, utilisent le fichier admin-ajax.php de WordPress pour filtrer les publications dans la catégorie sélectionnée.

Tout fonctionne très bien, cependant, j'ai du mal à obtenir la mise à jour de la pagination. J'utilise query_posts comme suit:

$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);

Je repasse ensuite les $ posts en tant que données, mais je ne sais pas comment accéder à la pagination mise à jour.

Je pensais à quelque chose dans ce sens:

 $pagedposts=array();
 $pagedposts['posts']=$posts;
 $pagedposts['pagination']=???

Donc, $ pagedposts ['pagination'] serait la donnée nécessaire pour mettre à jour le vieux pagi après l’appel ajax.

J'ai trouvé quelqu'un d'autre avait ce problème ici , mais il n'y a pas de solution là-bas ...

5
gray

En fin de compte, j'ai constaté qu'il n'était pas possible de mettre à jour la pagination. La façon dont j'ai chargé le prochain lot de messages a été de définir un post offset, et d'utiliser un bouton Charger plus.

Donc, dans votre appel ajax où vous chargez plus de publications, vous devez passer sur une valeur de décalage:

$.ajax({
     url: '/wp-admin/admin-ajax.php', 
     type: "POST",
     data: {
            'action': 'filter_posts',
            'selected_options':selected_options,
            'offset':postoffset
       }//etc...

Comme cette valeur de décalage changera toujours, vous devez stocker la valeur dans une variable. Ci-dessus, j'ai utilisé 'postoffset'

La façon dont vous devez déterminer la valeur du décalage est simple. Vous pouvez simplement utiliser jquery pour compter le nombre de publications actuellement sur la page:

    var postoffset = $('.hentry').length;

Où .hentry est le nom de ma classe de poste.

Une fois que vous recevez le post offset dans votre script php, vous pouvez le définir comme suit:

 $args= array
    (
        'offset'=>$offset,
        'post_type'=>$post_type,
        'paged'=>$paged,
        'posts_per_page'=>9,
        'orderby' => 'title',
        'order' => 'ASC'
    );

et puis branchez-le dans votre query_args (en plus de déterminer l'offset ci-dessus, j'ai ajouté une option 'posts_per_page' qui me permet de voir clairement les 9 posts supplémentaires chargés, et mon offset augmentant chaque fois de 9):

$posts=query_posts( $args);

Pour configurer votre bouton Charger plus au lieu d’utiliser la pagination, vous pouvez simplement mettre une image div ou une image sur votre page et lui attribuer un identifiant - par exemple:

<div id="load-more">LOAD MORE </div>

et le jquery:

function load_more_button_listener($){
 $('#load-more').click(function(event){
       event.preventDefault();
        var postoffset = $('.hentry').length;

 // console.log("offset: "+postoffset);

  //call the original ajax function to load more posts, with the new offset:
  load_more_posts($,postoffset);
 });  
}
3
gray