O que eu estou procurando fazer:
Configurar WP_Query
paginação em um arquivo de modelo single-post-post-type.php
O que eu fiz
1) Criou um tipo de postagem chamado "autores". Cada postagem nesse tipo de postagem é um autor individual.
2) As páginas da tela de edição padrão contêm uma lista suspensa que lista todas as postagens (autores) do tipo de postagem personalizada dos autores.
3) Criou um modelo single-autores.php que consulta todas as postagens com os metadados do autor no menu suspenso; portanto, o resultado é uma lista de postagens que têm o mesmo autor atribuído a elas (como um arquivo):
<?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();
?>
No que estou preso
Os links de paginação não aparecem. Eu fiz algumas pesquisas e descobri que eles usam a $wp_query
variável; no entanto, quando mudei minha variável de consulta para $wp_query
, os links apareceram, mas, quando clicados, não fizeram nada.
Alguma idéia de onde estou errado?
Editar:
Para responder a algumas de suas perguntas, minha consulta gera com êxito as postagens que estou consultando, $ author_id já possui um valor que eu não incluí neste snippet de código. Da mesma forma, deixei de fora a saída real do conteúdo no loop while, porque essa parte não é o problema. O problema é que eu preciso paginar o conteúdo que já existe nesta única postagem.
O objetivo dessa funcionalidade era permitir que as postagens tivessem autores personalizados (fora do sistema Usuários interno) e o objetivo deste modelo é gerar todas as postagens para um determinado autor (que já está funcionando).
the_title()
'meta_value' => $author_id
sendo preenchido a partir do menu suspenso mencionado? E ao selecionar cada autor pelo menu suspenso, as dez primeiras postagens são exibidas corretamente?$author_query->have_posts()
retornetrue
e que$author_query
realmente contenha postagens?Respostas:
Você tem 2 problemas.
Primeiro problema
A linha
falhará, porque na exibição de postagem singular, quando o URL contém
'/page/XX/'
, a variável WordPress define é'page'
e não'paged'
.Você pode pensar em usar em
'page'
vez de'paged'
, mas isso também não funcionará, porque uma vez que a'page'
variável se destina a ser usada para postagem singular de várias páginas (separação de páginas usando<!--nextpage-->
) e uma vez que a postagem não é de várias páginas, o WordPress redirecionará a solicitação para o URL sem'/page/XX/'
.É o que acontece quando você nomeia sua variável de consulta
$wp_query
.A solução é impedir esse redirecionamento removendo a função responsável por ele, que está
'redirect_canonical'
conectada a'template_redirect'
:Então, no seu
functions.php
add:Agora, o WordPress não redirecionará mais e definirá corretamente a
'paged'
consulta var.Segundo problema
next_posts_link()
eprevious_posts_link()
ambos marcamif ( ! is_single() )
para exibir a paginação.Agora, isso
is_single()
é verdade no seu caso, porque você está em uma única postagem do tipo 'autor', portanto essas funções não podem funcionar conforme o esperado.Você tem 3 possibilidades:
query_posts
para substituir a consulta principal (realmente não recomendada)is_single()
é falso para páginas, e seu código funcionará lá.Esse é o código da solução número 3:
e use-o assim no
single-authors.php
:fonte
the_posts_pagination
mas tive que tirar uma cópia do wp_query original, conforme descrito nesta pergunta: wordpress.stackexchange.com/questions/216821/…Com base em outra pergunta semelhante do WPSE "A paginação não está funcionando com os valores dos campos personalizados wp_query ", sugiro adicionar
global $paged;
ao início do seu arquivo de modelo:fonte
$GLOBALS['paged'] = get_query_var( 'paged' );
. Caso contrário, basta usar o conteúdo global.$author_query
para$wp_query
e isso pareceu fazer a paginação aparecer, mas quando clico nela, a página é atualizada e na verdade não passa para a próxima página, mesmo que haja várias páginas. Atualizei minha resposta para refletir essas alterações.global
e$GLOBALS
. Um pouco devar_dump()
, algumas funções e você está bem. Para realmente entendê-lo com um pouco de tentativa / erro, você terá aprox. precisa de meia hora. Isso o ajudará a entender melhor as funções versus as classes e a abordagem OOP como um todo também. E isso vai claramente trazer mais perto de namespaces compreensão :)