Solución para que next_posts_link() funcione con consultas personalizadas en WordPress

30 dic 2012, 00:34:35
Vistas: 19.6K
Votos: 9

Tengo una plantilla personalizada donde quiero mostrar publicaciones del blog paginadas. Este es el inicio de mi archivo:

$wp_query = new WP_Query($args);
    if($wp_query->have_posts()){
        while($wp_query->have_posts()){ $wp_query->the_post();
            //algo...
    <?php next_posts_link('Entradas más antiguas'); ?>
    <?php previous_posts_link('Entradas más recientes'); ?>

Funciona bien: muestra los enlaces MÁS ANTIGUAS y MÁS RECIENTES cuando corresponde. En la primera página solo muestra un enlace a entradas más antiguas. En la segunda página muestra ambos enlaces, etc.

Pero no quiero sobrescribir la consulta actual $wp_query... Quiero usar por ejemplo $wp_query2 para este bucle. Y los enlaces no aparecen si hago esto.

Según esto: http://codex.wordpress.org/Function_Reference/next_posts_link estas funciones imprimen un enlace al conjunto previo/siguiente de publicaciones dentro de la consulta actual. Supongo que $wp_query2 no es mi "CONSULTA ACTUAL" pero $wp_query siempre lo es. ¿Puedo cambiar esto de alguna manera?

ACTUALIZACIÓN: Al agregar &paged=2 manualmente al enlace, este redirige correctamente al siguiente conjunto de publicaciones (siguiente página). En la segunda, tercera página, etc. previous_posts_link() funciona incluso usando $wp_query2. Solo me falta la funcionalidad de next_posts_link() en cada página.

0
Todas las respuestas a la pregunta 3
3
12

next_posts_link y previous_posts_link utilizan la consulta global $wp_query.

function get_next_posts_link( $label = null, $max_page = 0 ) {
    global $paged, $wp_query;

http://core.trac.wordpress.org/browser/tags/3.5/wp-includes/link-template.php#L1523

Eso significa que necesitas hacer algo como esto para que funcionen correctamente.

$orig_query = $wp_query;
$wp_query = new WP_Query($args);
// el resto de tu código
$wp_query = $orig_query;

Si has terminado con $wp_query para esa carga de página, no hay razón para preservarla. Debería ser bastante fácil copiar esas funciones principales, modificarlas para aceptar un parámetro de consulta y crear tus propias funciones de paginación.

30 dic 2012 02:16:50
Comentarios

Gracias. Más sutil que simplemente sobrescribir $wp_query. Las funciones *_post_link solo usan $wp_query para calcular el valor del parámetro $max_pages, por lo que una discusión en Stack Overflow recomienda simplemente pasar ese valor en lugar de sobrescribir $wp_query. Lo cual parece más simple en cierto modo, pero me pone un poco nervioso ya que asume que futuras versiones de WP actuarán de esa manera (no está garantizado: no es parte de la API/contrato, sino que depende del conocimiento del manejo interno de variables del código). http://stackoverflow.com/questions/14364488/wordpress-pagination-next-posts-link-on-custom-wp-query-not-showing

Andy Giesler Andy Giesler
16 may 2013 18:27:13

Ese es un buen punto, pero estás restaurando la variable, por lo que sobrescribir $wp_query no debería ser un problema. Honestamente, rara vez encuentro este problema-- pre_get_posts lo hace bastante fácil de evitar.

s_ha_dum s_ha_dum
16 may 2013 18:33:56

Lo siento, no fui claro. Estoy de acuerdo, tu método es seguro. Mi comentario sobre el riesgo se refería a la solución de Stack Overflow. Esa otra solución parece más simple en la superficie (solo agregar un parámetro), pero depende de suposiciones sobre el funcionamiento interno del código central de WordPress... muy probablemente seguro, pero el funcionamiento interno del código puede cambiar. +1 a tu solución porque parece más a prueba de futuro.

Andy Giesler Andy Giesler
16 may 2013 22:54:44
0

Al revisar el código fuente de WordPress, parece que next_posts_link utiliza la variable global $paged. Mi suposición es que esto solo funcionará para el bucle principal.

Una solución bastante buena sobre cómo hacer que la paginación funcione para bucles secundarios se encuentra aquí: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/

Implica establecer explícitamente la variable de consulta paged en la query, así:

<h3>Artículos Recientes</h3>
<ul>
<?php 
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('showposts=5'.'&paged='.$paged);
?>

Espero que esto ayude.

30 dic 2012 02:16:17
0

Me encontré con el mismo problema. Tengo bucles anidados, por lo que en el bucle interno estoy usando $wp_query = new WP_Query($args); en lugar del WP_Query global. La solución que utilicé fue pasar explícitamente max_num_pages a la función next_posts_link. Esto también fue mencionado en los comentarios por Andy Giesler.

Solución:

<?php  
  //bucle externo  
    //algún código externo
    //comienza bucle interno
      $inner_query = new WP_Query( 
                array('posts_per_page' => '4', 'paged' => get_query_var('paged')) 
            ); 
        // ...código para mostrar todas las publicaciones etc  
      previous_posts_link( 'Publicaciones antiguas' ); 
      next_posts_link( 'Publicaciones nuevas', $inner_query->max_num_pages ); //Nota esto
    //finaliza bucle interno
    //algún otro código del bucle externo  
  //finaliza bucle externo
?>  

La razón por la que tenemos que hacer esto es que WordPress internamente usa la propiedad $max_page del WP_query global, que si no está definida tendrá como valor predeterminado $max_page = 0

17 may 2022 04:26:30