Lo que estoy buscando hacer:
Configura la WP_Query
paginación en un archivo de plantilla single-custom-post-type.php
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 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-author.php que consulta todas las publicaciones con los metadatos del autor en el menú desplegable, por lo que el resultado es una lista de publicaciones que tienen asignado el mismo autor (algo así 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( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></span>
<?php } ?>
</div><!--/single navigation-->
<?php endif; ?>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_query();
?>
En lo que estoy atrapado
Los enlaces de paginación no aparecen. Investigué un poco y descubrí que usan la $wp_query
variable, sin embargo, cuando cambié mi variable de consulta $wp_query
, aparecieron los enlaces, pero cuando hice clic no hizo nada.
¿Alguna idea de a dónde me voy
Editar:
Para responder algunas de sus preguntas, mi consulta genera con éxito las publicaciones que estoy consultando, $ author_id ya tiene un valor que no incluí en este fragmento de código. Del mismo modo, omití la salida de contenido real dentro del ciclo while porque esa parte no es el problema. El problema es que necesito paginar el contenido que ya existe en esta publicación.
El propósito de esta funcionalidad era permitir que las publicaciones tuvieran autores personalizados (fuera del sistema de usuarios incorporado) y el propósito de esta plantilla es generar todas las publicaciones para un autor determinado (que ya está funcionando).
the_title()
'meta_value' => $author_id
está rellenando desde el menú desplegable mencionado? Y al seleccionar cada autor a través del menú desplegable, ¿se muestran correctamente las primeras diez publicaciones?$author_query->have_posts()
regresetrue
y de que$author_query
realmente contenga alguna publicación?Respuestas:
Tienes 2 problemas
Primer problema
La línea
fallará, porque en la vista de publicación singular, cuando la URL contiene
'/page/XX/'
, la variable que establece WordPress es'page'
y no'paged'
.Puede pensar en usar en
'page'
lugar de'paged'
, pero eso tampoco funcionará, porque una vez que la'page'
variable 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 es de varias páginas, WordPress redirigirá la solicitud a la URL sin'/page/XX/'
.Esto es lo que sucede cuando nombra su variable de consulta
$wp_query
.La solución es evitar esa redirección eliminando la función responsable de la misma, que está
'redirect_canonical'
enganchada en'template_redirect'
:Entonces, en su
functions.php
complemento:Ahora WordPress ya no redirigirá y configurará correctamente la
'paged'
consulta var.Segundo problema
next_posts_link()
yprevious_posts_link()
ambos verificanif ( ! is_single() )
para mostrar la paginación.Ahora,
is_single()
es cierto en su caso, porque está en una sola publicación de tipo 'autor', por lo que esas funciones no pueden funcionar como espera.Tienes 3 posibilidades:
query_posts
para anular la consulta principal (realmente no se recomienda)is_single()
es falso para las páginas, y su código funcionará allí.Ese es el código para la solución número 3:
y úsalo así en
single-authors.php
:fuente
the_posts_pagination
pero tuve que tomar una copia del wp_query original como se describe en esta pregunta: wordpress.stackexchange.com/questions/216821/…Basado en otra pregunta similar de WPSE "La paginación no funciona con los valores de los campos personalizados wp_query ", sugeriría agregar
global $paged;
al comienzo de su archivo de plantilla:fuente
$GLOBALS['paged'] = get_query_var( 'paged' );
. De lo contrario, solo use el contenido global.$author_query
a$wp_query
y eso pareció hacer aparecer la paginación, pero cuando hago clic en ella, la página se actualiza y en realidad no pasa a la página siguiente, a pesar de que hay varias páginas. He actualizado mi respuesta para reflejar esos cambios.global
y$GLOBALS
. Un poco devar_dump()
, algunas funciones y estás bien. Para entenderlo realmente con un poco de prueba / error, usted tendrá aprox. Necesito media hora. Esto lo ayudará a comprender mucho mejor las funciones frente a las clases y el enfoque OOP en general. Y claramente te acercará a comprender los espacios de nombres :)