WP_Query Paginação em single-custom.php

11

O que estou procurando fazer:

Configuração da paginação WP_Query em um arquivo de modelo single-custom-post-type.php

O que eu fiz

1) Criamos um tipo de post chamado "autores". Cada postagem desse tipo de postagem é de um autor individual.

2) As páginas de tela de edição de postagem padrão contêm uma lista suspensa que lista todas as postagens (autores) do tipo de postagem personalizado do autor.

3) Criamos um modelo single-authors.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 se fosse 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( '&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();
?>

O que eu estou preso

Os links de paginação não aparecem. Eu fiz alguma pesquisa e descobri que eles usam a variável $wp_query , mas quando eu mudei minha variável de consulta para $wp_query , os links apareceram, mas quando clicados não fizeram nada.

Alguma ideia de onde estou indo errado?

Editar:

Para responder algumas das suas perguntas, minha consulta exibe com êxito as postagens que estou consultando, $ author_id já tem um valor que não incluí neste snippet de código. Da mesma forma, deixei de fora a saída de conteúdo real no loop while porque essa parte não é o problema. O problema é que preciso paginar o conteúdo que já existe neste único post.

O objetivo dessa funcionalidade era permitir que as publicações tivessem autores personalizados (fora do sistema interno Usuários) e a finalidade desse modelo é produzir todas as postagens de um determinado autor (que já está funcionando).

    
por Shane 08.05.2014 / 18:38

2 respostas

14

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:

  1. Use query_posts para substituir a consulta principal
  2. 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á.
  3. 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 &raquo;' );
    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$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 );
    
por gmazzap 08.05.2014 / 21:35
0

Com base em outra pergunta WPSE similar " Paginação é não funcionando valores de campos personalizados wp_query ", sugiro adicionar global $paged; ao início do arquivo de modelo:

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