Uzyskaj bieżący numer strony

15

W sytuacji, gdy jedna strona ma 20 postów. Chciałbym uzyskać bieżący numer strony, aby na dole zamieścić fajne linki do stron. Jak uzyskać bieżącą stronę. Próbowałem tego

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

i na każdej stronie jest napisane: strona 1 z 1.

Jakieś pomysły,

Cudowny

Robin I Knight
źródło

Odpowiedzi:

23

Gdy WordPress korzysta z takiego podziału na strony, istnieje zmienna zapytania $paged, którą wpisuje. Więc strona 1 jest, $paged=1a strona 15 jest $paged=15.

Możesz uzyskać wartość tej zmiennej za pomocą następującego kodu:

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

Uzyskanie całkowitej liczby stron jest nieco trudniejsze. Najpierw musisz policzyć wszystkie posty w bazie danych. Następnie filtruj według opublikowanych postów (w porównaniu do wersji roboczych, zaplanowanych, kosza itp.). Następnie musisz podzielić tę liczbę przez liczbę postów, które mają pojawić się na każdej stronie:

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

Nie przetestowałem tego jeszcze, ale może być konieczne pobranie $posts_per_pagetego samego sposobu, w jaki został pobrany $paged(za pomocą get_query_var()).

EAMann
źródło
8
Dlaczego nie użyć $wp_query->max_num_pages?
t31os
1
To dobra alternatywa. Część $wp_querycałkowicie zapomniałem było tam: - /
EAMann
@EAMann BTW: istnieje także found_postswłaściwość „Łączna liczba znalezionych postów pasujących do aktualnych parametrów zapytania”, wp_count_posts () jest rodzajem narzutu.
jave.web
8

Możesz to zrobić za pomocą jednego wiersza kodu, ale z drugiej strony możesz chcieć dodać kod w innych miejscach, więc funkcja jest zwykle bardziej przydatna.

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;
}

UWAGA: Kod może przejść do pliku funkcji.

Wystarczy wywołać funkcję, w której chcesz wyświetlić komunikat „Strona x z y”, np.

<?php current_paged(); ?>

Jeśli potrzebujesz kodu do pracy z niestandardowym zapytaniem, tj. jeden utworzony za pomocą WP_Query, a następnie po prostu przekaż nazwę zmiennej, która przechowuje zapytanie do funkcji.

Przykład nieistniejącego zapytania:

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

Pobieranie bieżącej strony niestandardowego zapytania za pomocą wcześniej opublikowanej funkcji ..

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

Jeśli chcesz całkowicie zapomnieć o niestandardowej obsłudze zapytań i szukasz jednej linijki, to powinno to zrobić.

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

Mam nadzieję, że to pomoże .. :)

t31os
źródło
1
Na twoim miejscu sprawdziłbym, czy $varjest to zapytanie: if( is_a( $var, 'WP_Query' ) )zwróci true, jeśli jest to obiekt zapytania.
John P Bloch,
Tak, to naprawdę bardzo rozsądny pomysł, gotowe!
t31os
0

Jak wspomniano powyżej - prostszym sposobem uzyskania maksymalnej liczby stron jest:

global $wp_query

$wp_query->max_num_pages
Alex Standiford
źródło
0

Jedną z opcji, która działa na wszystkich moich stronach archiwum jest:

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

}

Najpierw zapytaj, czy jest na niej więcej niż jedna strona wp_query, a następnie połącz tytuł z bieżącą stroną przez $paged_current_pagei łączną liczbę stron $title_page_nrs. Wreszcie echoto. Jeśli powyżej 1 strony, to elsejeśli nie jest stronicowana. To idzie do mojego archive.php lub szablonów dla tego typu. Produkuje:

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

lub

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

andyNilson
źródło