Постраничная навигация по таксономии — это тот момент, на котором останавливается разработка небольших проектов, так как привычные методы работы с категориями перестают работать.
Предположим, что существует некий тип записей, например «service», для которого создана таксономия «services». Необходимо сделать так, чтобы данные типы публикаций выводились аналогично стандартным записям WordPress и у них была постраничная навигация по таксономии.
Для реализации данной задачи необходимо получить id текущего терма(term). Терм — это аналог конкретного раздела в категориях, но для произвольной таксономии, а таксономия — это аналог категории WordPress.
После того, как id терма получен, можно выяснить все данные, относящиеся к данному терму, что и следует сделать. Следом надо выяснить номер текущей страницы и если он не задан, указать, что просматривается первая страница.
После того, как вся информация получена делается запрос на получение всех записей для текущего терма в указанной таксономии с учетом отображаемой страницы, с указанием числа записей, выводимых на одной странице.
После того, как запрос выполнен следует сделать проверку — вернулся ли результат или же по запросу ничего не найдено. Если результат вернулся, то необходимо загрузить шаблон, определенный для данного типа записей и вывести данные.
После того, как записи, для текущей страницы, были выведены можно показывать общее количество страниц для данного терма указанной таксономии, после чего сбросить данные запроса.
Листинг кода — постраничная навигация по таксономии
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // определение id терма $term_id = get_queried_object()->term_id; // определение всех данных терма $term = get_term_by( 'id', $term_id, 'services' ); // определение количества странц с записями $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; // получение записей указанного терма в указанной таксономии $query = new WP_Query( array( 'post_type' => 'service', 'posts_per_page' => 10, 'orderby' => 'menu_order', 'paged' => $paged, 'tax_query' => array( array( 'taxonomy' => 'services', 'field' => 'slug', 'terms' => $term->slug ) ) ) ); // если записи существуют if ( $query->have_posts() ) { // пока записи не кончились while ( $query->have_posts() ) { // определение записей $query->the_post(); // если тип записи равен post if ( get_post_type() == 'service' ) { // вывод шаблона для данного типа записи get_template_part( 'content', 'service' ); } } // вывод меню навигации echo paginate_links( array( 'current' => max( 1, get_query_var( 'paged' ) ), 'total' => $query->max_num_pages, 'post_type' => 'service', ) ); // сброс query wp_reset_query(); } else { // в данном терме записей нет } |
Вышеописанный код можно написать в файле taxonomy-<taxonomy_name>.php
, где taxonomy_name
— это имя таксономии. То есть для данного случая файл должен называться taxonomy-services.php
.