Usar paginación con get_posts en tipo página

6 mar 2014, 21:20:42
Vistas: 20.6K
Votos: 4

¿Hay alguna manera de usar paginación en una consulta de páginas como se hace con las entradas?

Aquí está el código que estoy usando:

    $listingPages = get_posts( 
    array(
    'cild_of' => '7',
        'meta_key' => 'Type',
        'post_type' => 'page',
        'post_status' => 'publish',
        'orderby' => 'meta_value',
        'order' => 'ASC',
    'posts_per_page' => '20',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
    )
);

Puedo agregar /page/2 /page/3/ etc. a la URL y ver el siguiente conjunto de 20, sin embargo, cuando agrego mi código de paginación no se muestra nada.

<?php wpbeginner_numeric_posts_nav(); ?>

Aquí está la parte del function.php:

function wpbeginner_numeric_posts_nav() {

if( is_singular() )
    return;
global $wp_query;

/** Detener la ejecución si solo hay 1 página */
if( $wp_query->max_num_pages <= 1 )
    return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$max   = intval( $wp_query->max_num_pages );

/** Agregar la página actual al array */
if ( $paged >= 1 )
    $links[] = $paged;

/** Agregar las páginas alrededor de la página actual al array */
if ( $paged >= 3 ) {
    $links[] = $paged - 1;
    $links[] = $paged - 2;
}

if ( ( $paged + 2 ) <= $max ) {
    $links[] = $paged + 2;
    $links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";

/** Enlace a Entrada Anterior */
if ( get_previous_posts_link() )
    printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

/** Enlace a primera página, más puntos suspensivos si es necesario */
if ( ! in_array( 1, $links ) ) {
    $class = 1 == $paged ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
    if ( ! in_array( 2, $links ) )
        echo '<li>…</li>';
}

/** Enlace a página actual, más 2 páginas en cualquier dirección si es necesario */
sort( $links );
foreach ( (array) $links as $link ) {
    $class = $paged == $link ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}

/** Enlace a última página, más puntos suspensivos si es necesario */
if ( ! in_array( $max, $links ) ) {
    if ( ! in_array( $max - 1, $links ) )
        echo '<li>…</li>' . "\n";
    $class = $paged == $max ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
}

/** Enlace a Entrada Siguiente */
if ( get_next_posts_link() )
    printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";

}

0
Todas las respuestas a la pregunta 2
1

Deberías revisar tu código porque tienes algunas sentencias que harán que tu función de paginación retorne un valor vacío. Por ejemplo, el siguiente fragmento de código te sacará porque estás en una plantilla de página, por lo que is_singular() devuelve true:

if( is_singular() )
    return;

Además, estás usando el objeto global $wp_query dentro de tu función de paginación pero estás usando get_posts() para obtener la lista de páginas, no la consulta principal. Así que $wp_query->max_num_pages es cero porque la consulta principal era para una sola página. Por lo tanto, este fragmento de código también te sacará:

global $wp_query;

/** Detener la ejecución si solo hay 1 página */
if( $wp_query->max_num_pages <= 1 )
    return;

Eliminar ambos bloques de código no será suficiente porque usas nuevamente el objeto global $wp_query para obtener el número máximo de páginas:

 $max = intval( $wp_query->max_num_pages );

Además, si configuras la plantilla de página como la página frontal de tu blog, la variable paged no funcionará en la consulta, deberías usar la variable de consulta page.

Te recomiendo que reconsideres lo que estás intentando hacer. Mirando tu código, parece que estás intentando listar las páginas hijas de la página con ID 7 y paginar los resultados. Parece más fácil convertir esas páginas hijas en entradas normales bajo una categoría y mostrarlas en una plantilla de categoría estándar.

Si realmente necesitas que los elementos sean páginas hijas, en tu caso sería mejor usar un objeto new WP_Query(), no la función get_posts() y obtener el número máximo de páginas para tu función de paginación:

 $args =  array(
       'cild_of' => '7',
       'meta_key' => 'Type',
       'post_type' => 'page',
       'post_status' => 'publish',
       'orderby' => 'meta_value',
       'order' => 'ASC',
       'posts_per_page' => '20',
       'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
   );
   $query = new WP_Query($args);
   $max_num_pages = $query->max_num_pages;

   wpbeginner_numeric_posts_nav($max_num_pages);

Y la función de paginación:

function wpbeginner_numeric_posts_nav($max_num_pages = 0) {

/** Detener la ejecución si solo hay 1 página */
if( $max_num_pages <= 1 )
    return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;

/** Añadir la página actual al array */
if ( $paged >= 1 )
    $links[] = $paged;

/** Añadir las páginas alrededor de la página actual al array */
if ( $paged >= 3 ) {
    $links[] = $paged - 1;
    $links[] = $paged - 2;
}

if ( ( $paged + 2 ) <= $max_num_pages ) {
    $links[] = $paged + 2;
    $links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";

/** Enlace a la publicación anterior */
if ( get_previous_posts_link() )
    printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

/** Enlace a la primera página, más puntos suspensivos si es necesario */
if ( ! in_array( 1, $links ) ) {
    $class = 1 == $paged ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
    if ( ! in_array( 2, $links ) )
        echo '<li>…</li>';
}

/** Enlace a la página actual, más 2 páginas en cualquier dirección si es necesario */
sort( $links );
foreach ( (array) $links as $link ) {
    $class = $paged == $link ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}

/** Enlace a la última página, más puntos suspensivos si es necesario */
if ( ! in_array( $max_num_pages, $links ) ) {
    if ( ! in_array( $max_num_pages - 1, $links ) )
        echo '<li>…</li>' . "\n";
    $class = $paged == $max_num_pages ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max_num_pages ) ), $max_num_pages );
}

/** Enlace a la siguiente publicación */
if ( get_next_posts_link() )
    printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}
6 mar 2014 23:09:38
Comentarios

Gracias por lo anterior, estoy usando esto en un sitio en desarrollo, desafortunadamente uno de los tipos de publicación tiene 5 páginas y en la página 1 aparece como "1 2 3 5 ...", también falta el botón de siguiente, en la página 2 por ejemplo muestra "anterior 1 2 3 4 5" y todavía no hay siguiente. Agradecería cualquier ayuda, gracias.

Adrian Adrian
9 jul 2017 22:37:24
0

Parece que se trata de una consulta secundaria. paged es una variable de consulta del Core, es decir, es utilizada por el núcleo de WordPress. Esa variable será manipulada por el Core durante la carga normal de una página por la consulta principal al inicio de la carga. La consulta principal no sabe lo que hace tu consulta más adelante en la carga de la página. Lo que está sucediendo, estoy bastante seguro, es que estás intentando usar una variable de consulta "reservada" y estás viendo interferencia/conflicto entre la consulta principal y el funcionamiento de las funciones del Core.

La solución, si estoy en lo correcto, es usar una variable diferente a las utilizadas por el Core, algo como my_paged.

7 mar 2014 01:18:08