Obtenir le numéro de page actuel

15

Dans une situation où l'on a 20 publications par page. Je voudrais obtenir le numéro de page actuel afin de faire de jolis liens vers la page en bas. Comment obtenez-vous la page actuelle. J'ai essayé

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

et il dit simplement la page 1 de 1 sur chaque page.

Des idées,

Merveilleux

Robin I Knight
la source

Réponses:

23

Lorsque WordPress utilise une pagination comme celle-ci, il y a une variable de requête sur $pagedlaquelle il se base. Donc, la page 1 est $paged=1et la page 15 est $paged=15.

Vous pouvez obtenir la valeur de cette variable avec le code suivant:

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

Obtenir le nombre total de pages est un peu plus compliqué. Vous devez d'abord compter toutes les publications de la base de données. Ensuite, filtrez les articles publiés (par rapport à ceux qui sont des brouillons, planifiés, poubelles, etc.) Ensuite, vous devez diviser ce nombre par le nombre de publications que vous prévoyez d'afficher sur chaque page:

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

Je n'ai pas encore testé cela, mais vous devrez peut-être récupérer $posts_per_pagela même manière que vous avez récupéré $paged(en utilisant get_query_var()).

EAMann
la source
8
Pourquoi ne pas utiliser $wp_query->max_num_pages?
t31os
1
C'est une bonne alternative. Une partie de $wp_queryj'ai complètement oublié était là: - /
EAMann
@EAMann BTW: il y a aussi la found_postspropriété "Le nombre total de messages trouvés correspondant aux paramètres de requête actuels", wp_count_posts () est une sorte de surcharge.
jave.web
8

Vous pouvez le faire avec une seule ligne de code, mais là encore, vous voudrez peut-être ajouter le code à d'autres endroits, donc une fonction est généralement plus 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;
}

REMARQUE: le code peut aller dans votre fichier de fonctions.

Appelez simplement la fonction où vous souhaitez afficher le message "Page x de y", par exemple.

<?php current_paged(); ?>

Si vous avez besoin du code pour travailler avec une requête personnalisée, par exemple. celui que vous avez créé à l'aide WP_Query, puis passez simplement le nom de la variable qui contient la requête à la fonction.

Exemple de requête inexistante:

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

Obtention de la page actuelle de la requête personnalisée à l'aide de la fonction publiée précédemment.

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

Si vous voulez juste oublier totalement le support de requête personnalisé et que vous recherchez un one-liner, alors cela devrait le faire.

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

J'espère que cela pourra aider.. :)

t31os
la source
1
Si j'étais vous, je vérifierais s'il $vars'agit d'une requête: if( is_a( $var, 'WP_Query' ) )retournera true si c'est un objet de requête.
John P Bloch
Oui, c'est en fait une idée très sensée, faite!.
t31os
0

Comme mentionné ci-dessus - un moyen plus simple d'obtenir le nombre maximum de pages est de:

global $wp_query

$wp_query->max_num_pages

Alex Standiford
la source
0

Une option qui fonctionne sur toutes mes pages d'archives est la suivante:

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

}

Recherchez d'abord s'il y a plus d'une page wp_query, puis concaténez le titre avec la page actuelle via $paged_current_pageet le nombre total de pages avec $title_page_nrs. Enfin echoça. Si au-dessus de 1 page en premier, alors elsesi n'est pas paginé. Cela va dans mon archive.php ou des modèles pour ce type. Cela produit:

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

ou

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

andyNilson
la source