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