WP_Query Pagination en single-custom.php

11

Lo que estoy buscando hacer:

Configura la paginación WP_Query en un único archivo de plantilla custom-post-type.php

Lo que he hecho

1) Creó un tipo de publicación llamado "autores". Cada publicación dentro de ese tipo de publicación es un autor individual.

2) Las páginas de la pantalla de publicación de edición estándar contienen un menú desplegable que enumera todas las publicaciones (autores) del tipo de publicación personalizada de los autores.

3) Creé una plantilla single-authors.php que consulta todas las publicaciones con los metadatos del autor desde el menú desplegable, por lo que el resultado es una lista de publicaciones que tienen el mismo autor asignado (como un archivo):

<?php

// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
} else {
    $paged = 1;
}

$args = array(
    'posts_per_page'    =>  10,
    'meta_key'          => 'author_select',
    'meta_value'        => $author_id,
    'paged'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, '', true ) ) { ?>
        <span class="prev"><?php previous_post_link( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>

En qué estoy atrapado

Los enlaces de paginación no aparecen. He investigado un poco y he encontrado que usan la variable $wp_query , sin embargo, cuando cambié mi variable de consulta a $wp_query , aparecieron los enlaces, pero cuando se hizo clic no hizo nada.

¿Alguna idea de a dónde me voy mal?

Editar:

Para responder a algunas de sus preguntas, mi consulta genera correctamente las publicaciones que estoy consultando, $ author_id ya tiene un valor que no incluí en este fragmento de código. De manera similar, omití la salida del contenido real dentro del bucle while porque esa parte no es el problema. El problema es que necesito paginar el contenido que ya existe en esta publicación única.

El propósito de esta funcionalidad era permitir que las publicaciones tuvieran autores personalizados (fuera del sistema integrado de Usuarios) y el propósito de esta plantilla es generar todas las publicaciones para un autor determinado (que ya está funcionando).

    
pregunta Shane 08.05.2014 - 18:38

2 respuestas

14

Tienes 2 problemas.

Primer problema

La línea

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

fallará, porque en la vista de publicación singular, cuando la URL contiene '/page/XX/' , la variable de conjuntos de WordPress es 'page' y no 'paged' .

Puedes pensar en usar 'page' en lugar de 'paged' , pero eso tampoco funcionará, porque una vez que la variable 'page' está destinada a usarse para publicaciones singulares de varias páginas (separación de páginas usando <!--nextpage--> ) y una vez que la publicación no sea de varias páginas, WordPress redirigirá la solicitud a la URL sin '/page/XX/' .

Esto es lo que sucede cuando asignas un nombre a la variable de consulta $wp_query .

La solución es evitar esa redirección eliminando la función responsable de ella, que está 'redirect_canonical' enganchada en 'template_redirect' :

Por lo tanto, en su functions.php agregue:

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $query->set( 'page', 1 );
            $query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

Ahora, WordPress ya no redireccionará y configurará correctamente la var. 'paged' query

Segundo problema

next_posts_link() y previous_posts_link() comprueban if ( ! is_single() ) para mostrar la paginación.

Ahora, is_single() es cierto en tu caso, porque estás en una única publicación del tipo 'autor', por lo que esas funciones no pueden funcionar como esperas.

Tienes 3 posibilidades:

  1. Use query_posts para anular la consulta principal
  2. Use una plantilla de página personalizada en lugar de un tipo de publicación personalizada, porque is_single() es falso para las páginas, y su código trabajar allí.
  3. Escriba su propia función de paginación y úsela

Ese es el código para la solución número 3:

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) $query = $GLOBALS['wp_query'];
    $max_page = ( int ) $query->max_num_pages;
    // Only one page for the query, do nothing
    if ( $max_page <= 1 ) return;
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) $paged = 1;
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // If we are in 1st page and required previous or in last page and required next,
    // do nothing
    if ( $target_page < 1 || $target_page > $max_page ) return; 
    if ( null === $label )  $label = __( 'Next Page &raquo;' );
    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), $label );
}

y utilícelo así en el single-authors.php :

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );
    
respondido por el gmazzap 08.05.2014 - 21:35
0

Basado en otra pregunta WPSE similar " Pagination no funciona wp_query valores de campos personalizados ", sugeriría agregar global $paged; al principio de su archivo de plantilla:

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    
respondido por el Stephen S. 08.05.2014 - 20:26

Lea otras preguntas en las etiquetas