Paginación AJAX en WordPress con query_posts

7 nov 2013, 12:22:11
Vistas: 14K
Votos: 5

Tengo una lista de categorías con checkboxes que, al marcarlas, usan admin-ajax.php de WordPress para filtrar los posts según la categoría seleccionada.

Todo funciona correctamente, pero estoy teniendo problemas para actualizar la paginación. Estoy usando query_posts de la siguiente manera:

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

Luego paso los $posts como datos de respuesta, pero no sé cómo acceder a la paginación actualizada...

Estaba pensando en algo así:

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

Donde $pagedposts['pagination'] contendría los datos necesarios para actualizar la paginación después de que la llamada AJAX sea exitosa.

Encontré que alguien más tuvo este problema aquí, pero no hay solución publicada...

0
Todas las respuestas a la pregunta 1
0

Al final descubrí que no es posible actualizar la paginación. La forma en que cargué el siguiente lote de publicaciones fue estableciendo un desplazamiento de publicación (post offset) y usando un botón de cargar más.

Entonces, en tu llamada AJAX donde estás cargando más publicaciones, necesitas pasar un valor de desplazamiento (offset):

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

Debido a que este valor de desplazamiento siempre cambiará, necesitas almacenar el valor en una variable. Arriba, he usado 'postoffset'.

La forma en que necesitas determinar el valor del desplazamiento es simple. Puedes simplemente usar jQuery para contar cuántas publicaciones hay actualmente en la página:

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

Donde .hentry es el nombre de mi clase de publicación.

Una vez que recibas el desplazamiento de la publicación en tu script PHP, puedes configurarlo así:

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

y luego integrarlo en tus query_args (además de determinar el desplazamiento anterior, he agregado una opción 'posts_per_page' que me permite ver claramente las 9 publicaciones adicionales cargadas, y mi desplazamiento de publicación aumentando en 9 cada vez):

$posts=query_posts( $args);

Para configurar tu botón de cargar más en lugar de usar la paginación, puedes simplemente colocar un div o imagen en tu página y darle un ID, por ejemplo:

<div id="load-more">CARGAR MÁS </div>

y el jQuery:

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

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

  //llama a la función AJAX original para cargar más publicaciones, con el nuevo desplazamiento:
  load_more_posts($,postoffset);
 });  
}
11 dic 2013 00:36:25