23

In a situation where one has 20 posts per page. I would like to get the current page number in order to make some nice page links at the bottom. How do you get the current page. I tried this

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

and it just says page 1 of 1 on every page.

Any ideas,

Marvellous

6 Answers 6

38

When WordPress is using pagination like this, there's a query variable $paged that it keys on. So page 1 is $paged=1 and page 15 is $paged=15.

You can get the value of this variable with the following code:

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

Getting the total number of pages is a bit trickier. First you have to count all the posts in the database. Then filter by which posts are published (versus which are drafts, scheduled, trash, etc.). Then you have to divide this count by the number of posts you expect to appear on each page:

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

I haven't tested this yet, but you might need to fetch $posts_per_page the same way you fetched $paged (using get_query_var()).

3
  • 9
    Why not use $wp_query->max_num_pages?
    – t31os
    Mar 18, 2011 at 15:47
  • 1
    That's a sound alternative. Part of $wp_query I completely forgot was there :-/
    – EAMann
    Mar 18, 2011 at 17:49
  • @EAMann BTW: there is also found_posts property "The total number of posts found matching the current query parameters", wp_count_posts() is kind of an overhead.
    – jave.web
    Mar 13, 2017 at 14:31
9

You could do it with a single line of code, but then again, you might want to add the code in other places, so a function is usually more useful.

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

NOTE: Code can go into your functions file.

Simply call the function where you want to show the "Page x of y" message, eg.

<?php current_paged(); ?>

If you need the code to work with a custom query, ie. one you've created using WP_Query, then simply pass along the name of the variable that holds the query to the function.

Example non-existant query:

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

Getting the current page for the custom query using the function posted earlier..

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

If you want to just totally forget the custom query support and you're looking for a one-liner, then this should do it..

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

Hope that helps.. :)

2
  • 1
    If I were you I'd check if $var is a query: if( is_a( $var, 'WP_Query' ) ) will return true if it's a query object. Mar 18, 2011 at 14:30
  • Yes, that's actually a very sensible idea, done!.
    – t31os
    Apr 16, 2011 at 10:18
1

From wordpress documentation paginate_links( string|array $args = '' ):

<?php
global $wp_query;
 
$big = 999999999; // need an unlikely integer
 
echo paginate_links( array(
    'base'    => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'  => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total'   => $wp_query->max_num_pages
) );
?>

This will list the page numbers and Next post, and Previous post. You need to post this link on the pages where you want the page numbers to be displayed.

0

As mentioned above - a simpler way to get the max number of pages is with:

global $wp_query

$wp_query->max_num_pages

1
  • Although this is correct, the question was about the getting the current page.
    – Loosie94
    Apr 15 at 8:25
0

One option that works on all my archive pages is this:

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

}

First query if there is more than one page in this wp_query, then concatenate title with current page via $paged_current_page and total pages with $title_page_nrs. Lastly echo it. If above 1 page first, then else if is not paged. This goes into my archive.php or templates for this type. It produces:

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

or

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

0
$page = max( 1, get_query_var( 'paged' ) );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.