Wordpress - Get the Current Page Number

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()).


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.. :)

Tags:

Posts

Pages