¿Cómo usar the_posts_navigation para wp_query y get_posts?
WordPress tiene la función the_posts_navigation
desde la versión 4.1.0. Pero no sé cómo usarla con wp_query
o get_posts
. El siguiente código está en un archivo de plantilla de página.
Método wp_query:
<?php
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} else if ( get_query_var('page') ) {
$paged = get_query_var('page');
} else {
$paged = 1;
}
$get_posts=new wp_query('post_type=case&posts_per_page=2&paged='.$paged);
while($get_posts->have_posts()):$get_posts->the_post();
the_title();
endwhile;
the_posts_pagination( array(
'prev_text' => __( 'Página anterior', 'cm' ),
'next_text' => __( 'Página siguiente', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Página', 'cm' ) . ' </span>',
) );
?>
Método get_posts:
<?
while(have_posts()):the_post();
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} else if ( get_query_var('page') ) {
$paged = get_query_var('page');
} else {
$paged = 1;
}
$case_posts=get_posts('post_type=case&posts_per_page=2&paged='.$paged);
echo '<pre>';
print_r($case_posts);
echo '</pre>';
foreach($case_posts as $case_post){
echo $case_post->post_title;
}
endwhile;
// Navegación de página anterior/siguiente
the_posts_pagination( array(
'prev_text' => __( 'Página anterior', 'cm' ),
'next_text' => __( 'Página siguiente', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Página', 'cm' ) . ' </span>',
) );
?>
No funcionan ni muestran la paginación, pero al ingresar http://127.0.0.1/gdboer/?page_id=74&page=2 manualmente en la barra de direcciones, funciona. ¿Quién puede ayudarme? ¡Muchas gracias!

the_posts_navigation()
es simplemente una función envoltorio para get_the_posts_navigation()
, que a su vez es una función envoltorio para paginate_links
. Las dos primeras funciones utilizan exactamente los mismos parámetros que paginate_links
y de hecho también los pasan a esta última función.
get_the_posts_navigation()
y the_posts_navigation()
son buenas funciones nuevas ya que eliminan gran parte de la codificación personalizada y son más amigables para usuarios nuevos sin experiencia que desean enlaces de paginación numerados.
El único defecto en get_the_posts_navigation()
es que los desarrolladores envolvieron la función paginate_links
en una declaración condicional que establece que si la consulta principal ($wp_query
) tiene menos de 1 página (recordemos que la primera página es 0
y la segunda página es 2
), no muestre los enlaces. Esto es problemático para consultas personalizadas en plantillas de página. Las páginas siempre tendrán solo una página, por lo que estas funciones no funcionan con consultas personalizadas.
La única solución real si necesitas usar the_posts_navigation()
es utilizar la respuesta de @ChipBennet en esta publicación. Realmente no me gusta anular la consulta principal (es bastante "hacky", en mi opinión es como usar query_posts
), pero no veo otra solución para hacer que get_the_posts_navigation()
funcione con consultas personalizadas.

Gracias por tu respuesta. Ahora sé que la función no puede funcionar con consultas personalizadas. Por cierto, no te gusta anular la consulta principal. ¿Pero qué método usaste?

No utilizo la función nativa, escribí mi propia función de paginación que uso. Puedes verla aquí

Si uso un enlace permanente como http://127.0.0.1/gdboer/?post_type=case no funciona. Usar el enlace permanente http://127.0.0.1/gdboer/?page_id=74 está bien.

Tengo una plantilla personalizada y pasé horas luchando para mostrar el componente de paginación. Esto es lo que funcionó para mí.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 3,
'orderby' => 'menu_order',
'order'=> 'ASC',
'paged'=>$paged,
'post_type' => 'projects'
);
$projects = new WP_Query($args);
<!-- ejemplo funcional de paginación con números -->
...<?php endwhile;?>
<?php
$GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
the_posts_pagination( array(
'mid_size' => 1,
'prev_text' => __( 'Atrás', 'green' ),
'next_text' => __( 'Adelante', 'green' ),
'screen_reader_text' => __( 'Navegación de entradas' )
) ); ?>
O
<!-- ejemplo funcional de paginación sin números -->
...<?php endwhile;?>
<?php next_posts_link( 'siguiente', $projects->max_num_pages ); ?>
<?php previous_posts_link('anterior') ?>

Definitivamente una idea, la única parte que no me gusta mucho es modificar el objeto de la consulta principal. Es un poco truculento y puede convertirse en una pesadilla porque no se restablece la consulta principal una vez que terminas. Tenlo en cuenta. Por eso la globalización es algo tan malvado, cualquiera puede cambiar los valores. Recuerda, muchos plugins dependen de variables globales, especialmente $wp_query
y $post

Esta función utiliza get_the_posts_pagination()
que usa la variable GLOBAL wp_query
para configurar la función paginate_links()
, por lo que creo que no funciona con get_posts
.
Intenta usar la función paginate_links()
directamente o la función posts_nav_link()
PD: Asegúrate de usar wp_reset_query()

gracias por tu respuesta. Sé que paginate_links funciona para mí. pero quiero usar la nueva función the_posts_navigation. Revisé cuidadosamente el código fuente de get_the_posts_navigation y me referí al tema de twentyfifteen.
