Obter o número da página atual

15

Em uma situação em que há 20 postagens por página. Gostaria de obter o número da página atual para fazer alguns links de página interessantes na parte inferior. Como você obtém a página atual. Eu tentei isso

<?php echo '(Page '.$page.' of '.$numpages.')'; ?>

e apenas diz a página 1 de 1 em todas as páginas.

Alguma ideia,

Maravilhoso

Robin I Knight
fonte

Respostas:

23

Quando o WordPress usa paginação como essa, há uma variável de consulta $pagedque ele utiliza . Então a página 1 é $paged=1e a página 15 é $paged=15.

Você pode obter o valor dessa variável com o seguinte código:

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

Obter o número total de páginas é um pouco mais complicado. Primeiro você precisa contar todas as postagens no banco de dados. Em seguida, filtre quais postagens são publicadas (versus quais são rascunhos, agendados, lixeira etc.). Então você deve dividir essa contagem pelo número de postagens que você espera que apareça em cada página:

$total_post_count = wp_count_posts();
$published_post_count = $total_post_count->publish;
$total_pages = ceil( $published_post_count / $posts_per_page );

Ainda não testei isso, mas talvez você precise buscar $posts_per_pageda mesma maneira que buscou $paged(usando get_query_var()).

EAMann
fonte
8
Por que não usar $wp_query->max_num_pages?
T31os
1
Essa é uma boa alternativa. Parte do que $wp_queryeu esqueci completamente estava lá: - /
EAMann
@EAMann BTW: também existe a found_postspropriedade "O número total de mensagens encontradas correspondentes aos parâmetros de consulta atuais", wp_count_posts () é uma espécie de sobrecarga.
jave.web
8

Você pode fazer isso com uma única linha de código, mas, novamente, convém adicionar o código em outros lugares, para que uma função seja geralmente mais útil.

function current_paged( $var = '' ) {
    if( empty( $var ) ) {
        global $wp_query;
        if( !isset( $wp_query->max_num_pages ) )
            return;
        $pages = $wp_query->max_num_pages;
    }
    else {
        global $$var;
            if( !is_a( $$var, 'WP_Query' ) )
                return;
        if( !isset( $$var->max_num_pages ) || !isset( $$var ) )
            return;
        $pages = absint( $$var->max_num_pages );
    }
    if( $pages < 1 )
        return;
    $page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    echo 'Page ' . $page . ' of ' . $pages;
}

NOTA: O código pode entrar no seu arquivo de funções.

Simplesmente chame a função onde deseja mostrar a mensagem "Página x de y", por exemplo.

<?php current_paged(); ?>

Se você precisar do código para trabalhar com uma consulta personalizada, por exemplo. aquele que você criou usando WP_Query, basta passar o nome da variável que mantém a consulta para a função.

Exemplo de consulta inexistente:

$fred = new WP_Query;
$fred->query();
if( $fred->have_posts() ) 
... etc..

Obtendo a página atual da consulta personalizada usando a função postada anteriormente.

<?php current_paged( 'fred' ); ?>

Se você deseja esquecer totalmente o suporte à consulta personalizada e está procurando uma linha, isso deve ser feito.

<?php echo 'Page '. ( get_query_var('paged') ? get_query_var('paged') : 1 ) . ' of ' . $wp_query->max_num_pages; ?>

Espero que ajude.. :)

t31os
fonte
1
Se eu fosse você, verificaria se $varé uma consulta: if( is_a( $var, 'WP_Query' ) )retornará true se for um objeto de consulta.
John P Bloch
Sim, essa é realmente uma ideia muito sensata!
T31os
0

Como mencionado acima - uma maneira mais simples de obter o número máximo de páginas é com:

global $wp_query

$wp_query->max_num_pages

Alex Standiford
fonte
0

Uma opção que funciona em todas as minhas páginas de arquivo é a seguinte:

$paged_maxnum = $GLOBALS['wp_query']->max_num_pages;

if ( $paged_maxnum > 1 ) {

    $paged_current_page = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;
    $title_page_nrs = 'page nr ' . $paged_current_page . ' of ' . $paged_maxnum;

    echo '<title>' . get_the_archive_title( '', false ) . ' - ' . $title_page_nrs . ' | Your Website Name</title>';

} else {

    echo '<title>' . get_the_archive_title( '', false ) . ' | Your Website Name</title>'; 

}

Primeira consulta se houver mais de uma página wp_query, concatene o título com a página atual via $paged_current_pagee total de páginas com $title_page_nrs. Por fim echo. Se acima de 1 página primeiro, elsese não for paginado. Isso vai para o meu archive.php ou modelos para esse tipo. Produz:

<title>Taxonomy title - page nr 1 of 4 | Your Website Name</title>

ou

<title>Taxonomy title | Your Website Name</title>

andyNilson
fonte