Ottieni il numero di pagina corrente


15

In una situazione in cui si hanno 20 post per pagina. Vorrei ottenere il numero di pagina corrente al fine di creare alcuni link alla pagina in basso. Come si ottiene la pagina corrente. Ci ho provato

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

e dice solo la pagina 1 di 1 su ogni pagina.

Qualche idea,

Meravigliosa

Risposte:


23

Quando WordPress utilizza l'impaginazione in questo modo, c'è una variabile di query su $pagedcui si imposta. Quindi la pagina 1 è $paged=1e la pagina 15 è $paged=15.

È possibile ottenere il valore di questa variabile con il seguente codice:

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

Ottenere il numero totale di pagine è un po 'più complicato. Innanzitutto devi contare tutti i post nel database. Quindi filtra in base a quali post vengono pubblicati (anziché quali bozze, pianificati, cestino, ecc.). Quindi devi dividere questo conteggio per il numero di post che ti aspetti di apparire su ogni pagina:

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

Non l'ho ancora testato, ma potresti dover recuperare $posts_per_pagenello stesso modo in cui l'hai recuperato $paged(usando get_query_var()).


8
Perché non usare $wp_query->max_num_pages?
t31os,

1
Questa è una valida alternativa. Una parte di $wp_queryme completamente dimenticata era lì: - /
EAMann

@EAMann BTW: esiste anche la found_postsproprietà "Il numero totale di post trovati corrispondenti ai parametri della query corrente", wp_count_posts () è una specie di overhead.
jave.web,

8

Potresti farlo con una singola riga di codice, ma, di nuovo, potresti voler aggiungere il codice in altri punti, quindi una funzione è di solito più utile.

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: il codice può andare nel file delle funzioni.

È sufficiente chiamare la funzione in cui si desidera mostrare il messaggio "Pagina x di y", ad es.

<?php current_paged(); ?>

Se è necessario che il codice funzioni con una query personalizzata, ad es. uno che hai creato usando WP_Query, quindi passa semplicemente il nome della variabile che contiene la query alla funzione.

Esempio di query inesistente:

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

Ottenere la pagina corrente per la query personalizzata utilizzando la funzione pubblicata in precedenza.

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

Se vuoi dimenticare completamente il supporto delle query personalizzate e stai cercando un one-liner, allora questo dovrebbe farlo.

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

Spero possa aiutare.. :)


1
Se fossi in te verificherei se $varè una query: if( is_a( $var, 'WP_Query' ) )restituirà vero se si tratta di un oggetto query.
John P Bloch,

Sì, in realtà è un'idea molto sensata, fatto !.
t31os,

0

Come accennato in precedenza, un modo più semplice per ottenere il numero massimo di pagine è con:

global $wp_query

$wp_query->max_num_pages

0

Un'opzione che funziona su tutte le mie pagine di archivio è questa:

$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>'; 

}

Prima interroga se c'è più di una pagina in questo wp_query, quindi concatena il titolo con la pagina corrente tramite $paged_current_pagee le pagine totali con $title_page_nrs. Infine echo. Se sopra 1 pagina prima, quindi elsese non è cercapersone. Questo va nel mio archivio.php o nei modelli per questo tipo. Produce:

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

o

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.