Pagination for custom WP_Query
In the example below we will display WooCommerce products (post_type=product) on a separate post page (post_type=post). I.e. we will use arbitrary query and make pagination for it.
See also:
$paged = max( 1, get_query_var('page') );
$query = new WP_Query( [
'post_type' => 'product',
'posts_per_page' => 5,
'paged' => $page,
] );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// your code here
the_title();
}
wp_reset_postdata();
// Display pagination if the number of products is greater than the requested amount
echo paginate_links( [
'base' => user_trailingslashit( wp_normalize_path( get_permalink() .'/%#%/' ) ),
'current' => $page,
'total' => $query->max_num_pages,
] );
}
We specified to output 5 products, if there are 22, for example, then there will be 5 pagination elements, 4 of which will be links of the following kind:
Current page, no link displayed (5 products) http://example.com/название-записи/2/ (5 products) http://example.com/название-записи/3/ (5 products) http://example.com/название-записи/4/ (5 products) http://example.com/название-записи/5/ (2 products)
Note:
-
In the parameter
basewhere the pagination link view is formed, do not use words likepageorpaged. Because withpagethere will be a redirect from the pagination page to the post itself, and withpagedthere will be a 404 error on the pagination page. -
Use
get_query_var( 'paged' )instead of the usualget_query_var( 'page' )to get the pagination page number. - This code will not work on pages with content divided into several pages by the
<!--nextpage-->tag, more details see here.
—
Note embeded into: paginate_links()