Você tem 2 problemas.
Primeiro problema
A linha
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
falhará, porque em uma visualização de postagem única, quando o URL contém '/page/XX/'
, os conjuntos variáveis do WordPress são 'page'
e não 'paged'
.
Você pode pensar em usar 'page'
em vez de 'paged'
, mas isso também não funcionará, porque a variável 'page'
deve ser usada para postagem única de várias páginas (separação de página usando <!--nextpage-->
) e uma vez que o post não é multi-page, o WordPress irá redirecionar o pedido para o URL sem '/page/XX/'
.
Isso é o que acontece quando você nomeia sua variável de consulta $wp_query
.
A solução é evitar esse redirecionamento removendo a função responsável por ele, que é 'redirect_canonical'
conectado em 'template_redirect'
:
Então, no seu functions.php
add:
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
Agora o WordPress não redirecionará mais e definirá corretamente o 'paged'
query var.
Segundo problema
next_posts_link()
e previous_posts_link()
ambos verificam if ( ! is_single() )
para exibir paginação.
Agora, is_single()
é verdadeiro no seu caso, porque você está em uma única postagem do tipo 'autor', então essas funções não podem funcionar conforme o esperado.
Você tem 3 possibilidades:
- Use
query_posts
para substituir a consulta principal - Use um modelo de página personalizado em vez de um tipo de postagem personalizado, porque
is_single()
é falso para páginas e seu código será trabalhar lá. - Escreva sua própria função de paginação e use isso
Esse é o código da solução 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 »' );
$label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&$1', $label );
printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), $label );
}
e use-o assim no single-authors.php
:
my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );