В WordPress по умолчанию существует несколько стандартных статусов записей: publish, draft, pending и другие. Но часто при разработке кастомных сайтов требуется создавать собственные статусы записей, например, для управления рабочим процессом или уникальной логикой публикации. В таких случаях возникает проблема: как реализовать корректную пагинацию для записей с этими кастомными статусами?
Почему стандартные методы пагинации не подходят для кастомных статусов
Большинство стандартных функций WordPress, таких как paginate_links()> или the_posts_pagination()>, работают с основным запросом, в котором статус записей обычно publish. Если вы фильтруете записи по кастомному статусу через WP_Query, то пагинация перестаёт работать корректно без дополнительной настройки.
Это связано с тем, что параметры пагинации зависят от общего количества записей, подходящих под запрос. Если не учитывать кастомный статус в подсчёте, ссылки пагинации будут некорректны и вести на пустые страницы.
Чтобы решить эту проблему, необходимо правильно настроить запрос и пагинацию, учитывая кастомные статусы.
Создание кастомного статуса записи
Для начала напомним, как зарегистрировать кастомный статус записи. Это делается с помощью хука register_post_status. Пример регистрации статуса review:
function wppagenavi_register_custom_status() {
register_post_status( 'review', array(
'label' => _x( 'На рассмотрении', 'post' ),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'На рассмотрении <span class="count">(%s)</span>', 'На рассмотрении <span class="count">(%s)</span>' ),
) );
}
add_action( 'init', 'wppagenavi_register_custom_status' );Этот статус появится в админке и позволит помечать записи как «На рассмотрении».
Настройка WP_Query для выборки записей с кастомным статусом
Чтобы получить записи с кастомным статусом, в запросе нужно указать параметр post_status:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'post_status' => 'review', // кастомный статус
'posts_per_page' => 10,
'paged' => $paged
);
$query = new WP_Query( $args );Важно передать корректное значение paged, чтобы пагинация работала.
Вывод записей и пагинации
Далее выводим записи и добавляем пагинацию с помощью функции paginate_links():
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
// Вывод записи
the_title( '<h2>', '</h2>' );
the_excerpt();
endwhile;
$big = 999999999; // уникальное число для замены
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages
) );
else :
echo '<p>Записей с таким статусом не найдено.</p>';
endif;
wp_reset_postdata();Этого достаточно для базовой пагинации по кастомному статусу.
Особенности пагинации при использовании WP-PageNavi
Если вы используете популярный плагин WP-PageNavi, то в параметрах вызова функции wp_pagenavi() также нужно передавать кастомный запрос:
if ( function_exists( 'wp_pagenavi' ) ) {
wp_pagenavi( array( 'query' => $query ) );
}Это гарантирует, что плагин правильно подсчитает количество страниц для кастомного статуса.
Кэширование и производительность
При работе с кастомными статусами и сложными запросами пагинация может замедлять сайт, особенно при большом количестве записей.
Для оптимизации рекомендуется использовать плагины кеширования и, при необходимости, реализовать собственное кеширование результатов запросов, например, через Transients API WordPress.
Также стоит проверить, не конфликтует ли пагинация с другими фильтрами и плагинами — иногда из-за этого пагинация работает некорректно.
Расширенный пример: пагинация для нескольких статусов
Иногда нужно выводить записи сразу с несколькими статусами, например, publish и review. Для этого в параметре post_status можно передать массив:
$args = array(
'post_type' => 'post',
'post_status' => array( 'publish', 'review' ),
'posts_per_page' => 10,
'paged' => $paged
);
$query = new WP_Query( $args );При этом пагинация будет работать корректно, показывая общее количество страниц с учётом всех выбранных статусов.
Полезные советы по отладке пагинации для кастомных статусов
- Убедитесь, что в запросе правильно передан параметр
pagedиз URL. - Проверяйте свойство
$query->max_num_pages— оно должно соответствовать реальному количеству страниц. - Для сложных запросов используйте дебаггер Query Monitor или аналогичные инструменты.
- При использовании WP-PageNavi обязательно передавайте в функцию объект запроса.
Таким образом, правильная настройка пагинации для кастомных статусов — это вопрос корректного построения запроса и правильного вывода навигационных ссылок. Это помогает создавать гибкие и удобные интерфейсы для администраторов и пользователей сайта.