No se puede hacer funcionar paginate_links con una consulta personalizada

5 abr 2014, 03:52:32
Vistas: 19.9K
Votos: 1

He creado una sección de noticias en mi sitio WordPress con los plugins advanced custom fields y custom post type ui. En la página personalizada de vista general de noticias (no los posts estándar de WordPress) quería limitar el número de noticias por página a seis y proporcionar una navegación con paginate_links. He construido el siguiente fragmento:

<section class="news-main" role="main">
    <?php
        $args = array(
            'post_type' => 'news',
            'posts_per_page' => '6'
        );
        $the_query = new WP_Query( $args );
        $temp_query = $wp_query;
        $wp_query = NULL;
        $wp_query = $the_query;
        $pagination = array(
            'base' => '%_%',
            'format' => '?page=%#%',
            'total' => $the_query->max_num_pages,
            'prev_next' => True,
            'prev_text' => __( '<< Anterior' ),
            'next_text' => __( 'Siguiente >>' )
        );
        if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <article class="news-snippet">
            <header class="news-box">
                <h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
                <a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
            </header>
            <div class="news-wrap">
                <p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
                <p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Más &rarr;</a></p>
            </div>
        </article>
    <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php else: ?>
        <p>No hay entradas</p>
    <?php endif; ?>
    <nav>
        <?php echo paginate_links( $pagination );
                $wp_query = NULL;
                $wp_query = $temp_query; ?>
    </nav>
</section>

Primero se definen los argumentos para wp_query, luego se establece $the_query con WP_Query, después la variable $wp_query se guarda en una variable temporal, se reinicia con NULL y luego se establece en la variable $the_query. En el último paso se establece el array de configuración para paginate_links. Luego está el bucle para mostrar los posts de noticias. Después del bucle se llama a la función paginate_links y finalmente el $wp_query se reinicia y se vuelve a escribir el contenido de la variable temporal $temp_query.

Si tengo, digamos, 15 entradas de blog, mi salida se ve así:

Diseño de paginate_links

Si paso el mouse sobre el número tres, el final del slug se ve así:

slug para página 3

El problema es que los enlaces anterior y siguiente no se muestran aunque están configurados. Mientras que el problema principal es el slug dado - si hago clic en el número tres, llego a una página 404. "page 3" donde me redirige es desconocido para WordPress. Gracias de antemano Ralf

Actualización:

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '1'
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
    $pagination = array(
        'base' => '%_%',
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $current_page,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Anterior' ),
        'next_text' => __( 'Siguiente >>' )
    );
}

Actualización 2:

Ok, con los siguientes cambios en la primera parte del código conseguí que la navegación funcione

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '3',
    'paged' => get_query_var( 'paged' )
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $the_paged,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Anterior' ),
        'next_text' => __( 'Siguiente >>' )
    );
}

La única pregunta que me queda (lo único que todavía no funciona bien) es si es posible que el primer enlace tenga link en lugar de link/?paged=1

1
Comentarios

¿Por qué estás utilizando la etiqueta h2 para el span de fecha?

ahmetlutfu ahmetlutfu
6 abr 2014 01:46:58
Todas las respuestas a la pregunta 1
5

En cuanto al número de páginas mostradas, revisa los argumentos para paginate_links, específicamente end_size y mid_size.

Respecto al error 404 - El problema es que no existe una página 3. El que una página muestre contenido o cargue la plantilla 404 depende de los resultados de la consulta principal, no de tu consulta personalizada que ejecutas en la plantilla. Si se trata de un tipo de contenido page, intenta establecer la variable de consulta paged en lugar de page.

5 abr 2014 06:36:29
Comentarios

Gracias, sí, la numeración ahora funciona correctamente, necesitaba algunos ajustes en la configuración, así como en los enlaces de anterior y siguiente. Básicamente, la paginación ya se ve bien, pero no es funcional en absoluto. Si hago clic ahora en el dos, llego a ?paged=2 y ya no aparece la plantilla 404. Pero por otro lado, todavía se muestran los artículos de la página inicial y el número uno permanece con la clase current en lugar del paged 2 en el que estoy. Además, el enlace Anterior no aparece.

rkoller rkoller
6 abr 2014 01:29:36

Y sobre tu sospecha de que todo depende de la consulta principal en lugar de la consulta personalizada que ejecuto, pensé que con $wp_query = $the_query; había "transferido" mi consulta personalizada a la consulta principal y la había hecho accesible a la función paginate_links.

rkoller rkoller
6 abr 2014 01:31:18

He añadido una actualización al post inicial con un fragmento de código actualizado para las partes PHP relacionadas con paginate_links (intenté incluir paged, pero todavía no funciona :/ ).

rkoller rkoller
6 abr 2014 01:33:44

el que se devuelva o no un error 404 ocurre antes de que se cargue tu plantilla, ese código nunca se ejecuta si las variables de consulta no son correctas. y estás viendo los primeros 6 posts en cada página porque no estableces paged en los argumentos de tu consulta personalizada.

Milo Milo
6 abr 2014 01:33:56

ahhhhhhhhhhhh ya veo. fui un poco lento - no había entendido y me di cuenta de que se puede usar paged directamente en la consulta personalizada, pero tiene perfecto sentido. qué tonto fui :( Ok, ahora la visualización de artículos funciona perfectamente. Lo único que queda por arreglar es que la navegación con paginate_links refleje los cambios. Pero tendré que probar y experimentar mañana por la mañana. Ahora ya es tarde. ¡Gracias!

rkoller rkoller
6 abr 2014 01:55:11