Пагинация для произвольного запроса WP_Query
В примере ниже будем выводить продукты WooCommerce (post_type=product) на отдельной странице записи (post_type=post). Т.е. будем использовать произвольный запрос и сделаем для него пагинацию.
Смотрите также:
// Запрашиваем продукты $query = new WP_Query( [ 'post_type' => 'product', 'posts_per_page' => 5, 'paged' => get_query_var( 'page' ), ] ); // Обрабатываем полученные в запросе продукты, если они есть if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // выводим заголовок the_title(); } wp_reset_postdata(); } // Выводим пагинацию, если продуктов больше запрошенного количество echo paginate_links( [ 'base' => user_trailingslashit( wp_normalize_path( get_permalink() .'/%#%/' ) ), 'current' => max( 1, get_query_var( 'page' ) ), 'total' => $query->max_num_pages, ] );
Мы указали выводить по 5 товаров, если их, к примеру 22, то будет выведено 5 элементов пагинации, из которых 4 будут ссылками следующего вида:
Текущая страница, ссылка не выводится (5 продуктов) http://example.com/название-записи/2/ (5 продуктов) http://example.com/название-записи/3/ (5 продуктов) http://example.com/название-записи/4/ (5 продуктов) http://example.com/название-записи/5/ (2 продукта)
Обратите внимание:
-
В параметре
base
где формируется вид ссылки пагинации не используются такие слова какpage
илиpaged
. Потому что cpage
будет перенаправление со страницы пагинации на саму запись, а сpaged
будет 404 ошибка на странице пагинации. -
Для получения номера страницы пагинации вместо привычного
get_query_var( 'paged' )
используемget_query_var( 'page' )
. - Этот код не будет работать на страницах у которых контент делиться на несколько страниц тегом <!--nextpage-->, подробнее см. здесь.
—
Эта заметка встроена в: paginate_links()