В стандартном админ-панели WordPress пагинация реализована для основных типов записей, таких как «Публикации» и «Страницы». Однако при работе с кастомными типами записей (custom post types) иногда возникают сложности с корректным отображением пагинации в списках записей. В этой статье мы подробно разберём, как правильно добавить и настроить пагинацию в админке для кастомных типов записей, учитывая фильтры и сортировки.
Почему стандартная пагинация может не работать для кастомных типов записей
При регистрации кастомного типа записи через функцию register_post_type пагинация в админке обычно работает автоматически. Но если вы дополнительно изменяете WP_Query или используете кастомные фильтры, пагинация может перестать корректно работать. Частая причина — неправильная передача параметров пагинации в запрос или вмешательство других хуков, меняющих параметры запроса.
Например, если вы используете хук pre_get_posts для модификации запроса в админке, нужно обязательно проверять, что запрос именно для нужного типа записи, и корректно передавать параметры пагинации.
Ещё одна причина — нестандартное использование нестандартных таблиц или кастомных методов вывода, которые не учитывают стандартные механизмы пагинации WordPress.
Добавление пагинации для кастомного типа записи в стандартном списке WP Admin
Рассмотрим пример, где у нас есть кастомный тип записи book, и мы хотим убедиться, что пагинация в списке книг в админке работает корректно даже при добавлении фильтров и сортировок.
Регистрация кастомного типа записи
Во-первых, регистрируем тип записи с параметром show_ui => true, чтобы он отображался в админке:
function wppagenavi_register_post_type_book() {
$args = array(
'label' => 'Книги',
'public' => true,
'show_ui' => true,
'supports' => array('title', 'editor', 'custom-fields'),
'has_archive' => true,
);
register_post_type('book', $args);
}
add_action('init', 'wppagenavi_register_post_type_book');
Корректная обработка пагинации через pre_get_posts
Если нужно доработать запрос в админке, обязательно проверяем, что запрос именно в админке и для нужного типа записи. Также параметр пагинации paged должен учитываться:
function wppagenavi_modify_admin_query($query) {
if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'book') {
// Например, сортируем по метаполю 'rating'
$query->set('meta_key', 'rating');
$query->set('orderby', 'meta_value_num');
$query->set('order', 'DESC');
// Параметр paged будет учтен автоматически
}
}
add_action('pre_get_posts', 'wppagenavi_modify_admin_query');
Таким образом, сортировка и фильтрация не нарушат работу пагинации в админке.
Создание кастомной пагинации в WP Admin для кастомных списков
Если вы создаёте собственный список кастомных записей в админке (например, через свой админ-меню или кастомный WP_List_Table), то пагинация должна реализовываться вручную. Рассмотрим пример кастомного класса с пагинацией.
Пример кастомного WP_List_Table с пагинацией
WP_List_Table — мощный класс для создания таблиц с пагинацией, сортировкой и фильтрами.
if (!class_exists('WP_List_Table')) {
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
}
class WPPagenavi_Books_List_Table extends WP_List_Table {
public function __construct() {
parent::__construct([
'singular' => 'book',
'plural' => 'books',
'ajax' => false
]);
}
public function get_columns() {
return [
'cb' => '<input type="checkbox" />',
'title' => 'Название',
'rating' => 'Рейтинг'
];
}
public function prepare_items() {
$per_page = 10;
$current_page = $this->get_pagenum();
$args = [
'post_type' => 'book',
'posts_per_page' => $per_page,
'paged' => $current_page,
'meta_key' => 'rating',
'orderby' => 'meta_value_num',
'order' => 'DESC'
];
$query = new WP_Query($args);
$this->items = $query->posts;
$this->set_pagination_args([
'total_items' => $query->found_posts,
'per_page' => $per_page
]);
}
public function column_default($item, $column_name) {
switch ($column_name) {
case 'title':
return '<strong>' . esc_html($item->post_title) . '</strong>';
case 'rating':
return get_post_meta($item->ID, 'rating', true);
default:
return '';
}
}
public function column_cb($item) {
return sprintf('<input type="checkbox" name="book[]" value="%d" />', $item->ID);
}
}
// Вызов и отрисовка таблицы в вашем админ меню
function wppagenavi_render_books_page() {
$table = new WPPagenavi_Books_List_Table();
$table->prepare_items();
echo '<form method="post">';
$table->display();
echo '</form>';
}
Этот класс создаёт таблицу с пагинацией, сортировкой по рейтингу и чекбоксами для выбора записей. Важно использовать методы get_pagenum() и set_pagination_args() для корректной работы пагинации.
Использование плагинов для улучшения пагинации в админке
Если вы не хотите писать собственный код, можно подобрать плагины, улучшающие работу с кастомными типами записей в админке.
- Clearfy Pro — плагин для оптимизации и кастомизации админки, включая улучшение списков и пагинации.
- Expert Review — плагин с расширенными возможностями работы с кастомными типами записей и их выводом.
Эти инструменты помогут автоматизировать многие задачи и избежать типичных ошибок при работе с пагинацией в админке.
Советы по отладке пагинации в WP Admin для кастомных типов записей
1. Используйте var_dump($query) или дебаггер, чтобы проверить параметры WP_Query и убедиться, что paged передаётся корректно.
2. Проверьте, что хук pre_get_posts не сбрасывает параметры пагинации.
3. При использовании WP_List_Table всегда вызывайте set_pagination_args() с правильным количеством элементов.
4. Убедитесь, что не конфликтуют другие плагины, меняющие запросы в админке.
Следуя этим рекомендациям, вы легко сможете добавить и настроить пагинацию для любых кастомных типов записей в админке WordPress, сохраняя при этом удобство и функциональность интерфейса.