paginate_links() WP 2.1.0
Позволяет создать ссылки пагинации для любых страниц.
Технически функцию можно использовать для создания пагинации где угодно. Параметр base используется как ссылка на УРЛ, которая будет использована для создания ссылки пагинации. Параметр format будет заменен на номер пагинации. Эта функция является ядром для всех функций пагинации в WordPress.
Для построения пагинации в WordPress есть специальные фукнции-обертки для этой функции:
Параметр type контролирует в каком формате будет возвращен результат:
- plain- просто ссылки разделенные переносом строки (По умолчанию).
- array - в виде массива данных для дальнейшей обработки в PHP
- list - <ul> список.
Числовой параметр total должен получить общее количество страниц пагинации, а параметр current номер текущей страницы пагинации. Пример параметра base - http://example.com/all_posts.php%_%
, где %_% - обязательная часть, которая будет заменена тем что указано в параметре format. Пример format - ?page=%#%
, здесь %#%, также обязательная часть, которая будет заменена числом текущей страницы пагинации. Вообще, в base можно сразу указать например так: http://example.com/all_posts.php?page=%#%
, а в формат пусто ('').
Чтобы добавить ссылки на предыдущую/следующую страницу, нужно включить логический параметр prev_next (указать ему true), а затем можно установить текст ссылок указав параметры prev_text/next_text (предыдущая ссылка/следующая ссылка).
Если включить параметр show_all, то будут выведены абсолютно все ссылки пагинации, вместо нескольких ссылок вокруг текущей и нескольких конечных ссылок. По умолчанию, этот параметр выключен, а сколько ссылок показывать вокруг текущей страницы и на концах контролируется параметрами: end_size и mid_size.
Также есть возможность добавить в ссылки переменные запроса, для этого укажите нужные переменные и их значения в виде массива в параметр add_args. Подробнее см. функцию add_query_arg().
Параметры before_page_number и after_page_number позволяют обернуть само число пагинации, например в <span> для стилизации. А вообще, эти параметры были созданы для того, чтобы указать текст для роботов, чтобы при просмотре кода, было понятно для чего предназначены ссылки.
В результате вы получите нечто подобное: « предыдущая 1 … 3 4 5 6 7 … 9 следующая »
Хуки из функции
Возвращает
HTML код.
Шаблон использования
$args = [ 'base' => '%_%', 'format' => '?page=%#%', 'total' => 1, 'current' => 0, 'show_all' => False, 'end_size' => 1, 'mid_size' => 2, 'prev_next' => True, 'prev_text' => __('« Previous'), 'next_text' => __('Next »'), 'type' => 'plain', 'add_args' => False, 'add_fragment' => '', 'before_page_number' => '', 'after_page_number' => '' ]; echo paginate_links( $args );
Использование
<?php echo paginate_links( $args ) ?>
- $args(строка/массив)
- Аргументы для построения пагинации.
По умолчанию: предустановки
Аргументы параметра $args
- base(строка)
- База для замены по формату. В конструкции:
http://example.com/all_posts.php%_%
%_% будет заменено значением аргумента format (см. ниже).
По умолчанию: '%_%' - format(строка)
- Формат замены.
По умолчанию: '?page=%#%' - total(число)
- Общее количество страниц, которые участвуют в пагинации.
По умолчанию: 1 - current(число)
- Номер текущей страницы пагинации.
- show_all(логический)
- Если выставить в true, то в списке ссылок будут показаны все страницы участвующие в пагинации. По умолчанию показывается только несколько ссылок спереди и сзади номера текущей страницы, количество ссылок регулируется аргументами: end_size и mid_size.
По умолчанию: false - end_size(число)
- Сколько номеров показывать сначала и конца ("предыдущая 12 ... 4 ... 89 следующая").
По умолчанию: 1 - mid_size(число)
- Сколько номеров показывать до и после текущего номера (... 123 5 678 ...).
По умолчанию: 2 - prev_next(логический)
- Выводить боковые ссылки "предыдущая/следующая страница". По умолчанию выводятся, если ненужно выводить эти ссылки пишем false.
По умолчанию: true - prev_text(строка)
- Текст ссылки "предыдущая страница".
По умолчанию: __('« Previous') - next_text(строка)
- Текст ссылки "следующая страница".
По умолчанию: __('Next »') - type(строка)
Формат возвращаемых данных.
-
plain
— строка ссылок разделенная пробелами. По умолчанию; -
array
— массив данных (для дальнейшей обработки); list
— html список <ul>.
По умолчанию: 'plain'
-
- add_args(логический)
- Массив аргументов (переменных запроса), которые нужно добавить к ссылкам.
По умолчанию: false - add_fragment(строка)
- Текст который добавиться ко всем ссылкам.
По умолчанию: '' - aria_current(строка)
- Значение атрибута
aria-current
. Возможные значения: 'page', 'step', 'location', 'date', 'time', 'true', 'false'. С версии 4.9.
По умолчанию: 'page'.
Примеры
#1 Пагинация, аналог wp_pagenavi
Чтобы добавить пагинацию на страницу результатов поиска или страницу архивов, используйте такой код:
function my_pagenavi() { global $wp_query; $big = 999999999; // уникальное число для замены $args = array( 'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ), 'format' => '', 'current' => max( 1, get_query_var('paged') ), 'total' => $wp_query->max_num_pages, ); $result = paginate_links( $args ); // удаляем добавку к пагинации для первой страницы $result = preg_replace( '~/page/1/?([\'"])~', '\1', $result ); echo $result; } // Теперь, где нужно вывести пагинацию используем // my_pagenavi();
#2 Пример с произвольным запросом WP_Query
Когда записи выводятся отдельным запросом с помощью new WP_Query для вывода пагинации можно установить параметр total
, в котором указать свойство WP_Query::$max_num_pages. Рассмотрим пример:
Это лишь демонстрационный пример, потому что он не учитывает основной запрос, в котором может получаться 404 страница и до этого кода дело вообще не дойдет. Также он может работать неправильно на отдельной странице записи.
<?php // 1 значение по умолчанию $paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1; $the_query = new WP_Query( array( 'posts_per_page' => 5, 'category_name' => 'gallery', 'paged' => $paged, ) ); // цикл вывода полученных записей while( $the_query->have_posts() ){ $the_query->the_post(); ?> <!-- HTML каждой записи --> <?php } wp_reset_postdata(); // пагинация для произвольного запроса $big = 999999999; // уникальное число echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'current' => max( 1, get_query_var('paged') ), 'total' => $the_query->max_num_pages ) ); ?>
#3 Пагинация для произвольного запроса 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-->, подробнее см. здесь.
Заметки
- Global. WP_Query. $wp_query WordPress Query object.
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
Список изменений
С версии 2.1.0 | Введена. |
С версии 4.9.0 | Added the aria_current argument. |