Кастомные колонки и фильтры в списке записей админки WordPress

Кастомные колонки и фильтры в списке записей админки WordPress

Кратко: список записей в админке WordPress можно доработать тремя хуками. manage_{$type}_posts_columns — добавить колонку, manage_{$type}_posts_custom_column — вывести её значение, manage_edit-{$type}_sortable_columns — включить сортировку. Фильтры (по автору, категории, своему полю) добавляют через restrict_manage_posts и parse_query. Работают для записей, страниц и любых своих типов; главное — не тянуть лишние запросы на каждую строку и корректно подхватывать значения из $_GET.

Как устроен список записей в админке

Админ-таблица — это стандартный WP_List_Table, который WordPress собирает из фильтров. Колонки задаются массивом, где ключ — идентификатор колонки, значение — подпись. По умолчанию для записей это «заголовок, автор, категории, метки, комментарии, дата».

Чтобы добавить свою колонку, не нужно переписывать таблицу: достаточно добавить ключ в массив. Значение выводится отдельным хуком, который получает имя колонки и ID записи. Такой подход не ломается при обновлении ядра.

Отдельно стоит фильтр типа записей: manage_posts_columns работает для записей, manage_pages_columns — для страниц, а для своего типа — manage_{post_type}_posts_columns. Если тип называется portfolio, хук будет manage_portfolio_posts_columns.

Добавляем колонку: базовый пример

Допустим, у нас есть тип записей «Товар» с метаполем sku. Покажем артикул в списке, чтобы редактору не открывать каждую запись.

add_filter( 'manage_product_posts_columns', function ( $columns ) {
    $new = array();
    foreach ( $columns as $key => $label ) {
        $new[ $key ] = $label;
        if ( 'title' === $key ) {
            $new['sku'] = 'Артикул';
        }
    }
    return $new;
} );

add_action( 'manage_product_posts_custom_column', function ( $column, $post_id ) {
    if ( 'sku' === $column ) {
        echo esc_html( get_post_meta( $post_id, 'sku', true ) );
    }
}, 10, 2 );

Ключевые моменты: вставляем колонку сразу после заголовка, а не в конец, и обязательно экранируем вывод. Если поле пустое — лучше вывести прочерк, чтобы колонка не выглядела сломанной.

Для стандартных записей те же хуки называются manage_posts_columns и manage_posts_custom_column. Код удобно держать в маленьком плагине или дочерней теме — как это организовать, разобрано в статье дочерняя тема WordPress: как создать и зачем нужна.

Сортировка по своей колонке

Сама по себе колонка не сортируется. Чтобы по ней можно было кликнуть, её нужно объявить сортируемой и подменить параметры запроса. Без второго шага сортировка «сработает», но порядок останется прежним.

add_filter( 'manage_edit-product_sortable_columns', function ( $columns ) {
    $columns['sku'] = 'sku';
    return $columns;
} );

add_action( 'pre_get_posts', function ( $query ) {
    if ( ! is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( 'sku' === $query->get( 'orderby' ) ) {
        $query->set( 'meta_key', 'sku' );
        $query->set( 'orderby', 'meta_value' );
    }
} );

Для числовых метаполей используйте meta_value_num, иначе «10» окажется меньше «2». Для дат — meta_value в формате Y-m-d, иначе сортировка будет строковой.

Фильтры над таблицей

Фильтры — это выпадающие списки над таблицей. Они добавляются хуком restrict_manage_posts, а обработка выбора — через parse_query или pre_get_posts. Типовой сценарий: фильтр по метаполю «Статус» со значениями «в наличии / под заказ».

add_action( 'restrict_manage_posts', function ( $post_type ) {
    if ( 'product' !== $post_type ) {
        return;
    }
    $current = isset( $_GET['stock_status'] ) ? sanitize_text_field( wp_unslash( $_GET['stock_status'] ) ) : '';
    ?>
    <select name="stock_status">
        <option value="">Все статусы</option>
        <option value="in" <?php selected( $current, 'in' ); ?>>В наличии</option>
        <option value="order" <?php selected( $current, 'order' ); ?>>Под заказ</option>
    </select>
    <?php
} );

И обработка — в parse_query: если параметр задан, добавляем meta_query в запрос. Всегда проверяйте, что запрос главный и что мы в админке, иначе фильтр «протечёт» на фронтенд.

Что выводить в колонках

Хорошая колонка отвечает на вопрос, который редактор задаёт чаще всего. Плохая — дублирует то, что уже видно, или требует запроса на каждую строку.

Колонка Источник Когда полезна
Артикул / SKU метаполе Магазин, склад, каталог
Цена метаполе Быстрый контроль прайса
Статус (в наличии) метаполе или таксономия Модерация каталога
Просмотры счётчик (метаполе) Выбор материалов для продвижения
Дата обновления post_modified Контроль устаревших страниц
SEO-оценка внешний сервис Массовый аудит контента

Не добавляйте в список десять колонок: таблица станет нечитаемой на ноутбуке. Три-четыре действительно нужных лучше, чем полный дашборд.

Отдельно продумайте поведение пустых значений. Если у половины записей артикул не заполнен, колонка с прочерками раздражает: либо выводите заглушку, либо скрывайте колонку для типов, где поле не используется. И не смешивайте в одной колонке разные данные — например, «Цена / Статус»: сортировка и фильтрация по такому полю перестают работать предсказуемо.

Полезно сразу договориться с редакцией, что считается «нормальным» значением. Для каталога это артикул, цена, наличие и дата обновления. Для блога — просмотры, дата обновления и автор. Универсального набора нет: список должен отвечать на вопросы конкретной команды, иначе колонки превращаются в декорацию.

И последнее: проверяйте доработку не только на тестовых данных. Откройте список с реальными 100–200 записями, отсортируйте по каждой новой колонке, примените фильтр в комбинации с поиском. Ошибки обычно вылезают именно в сочетании параметров, а не в чистом виде.

Производительность: главная ловушка

Хук вывода значения вызывается для каждой строки. Если внутри делать get_post_meta для одного ключа — это нормально (метаданные кешируются). Но если внутри запускать новый WP_Query, обращаться к внешнему API или считать что-то тяжёлое, список на 200 записей превратится в сотни запросов.

Правило: в колонке — только данные, которые уже есть у записи или лежат в метаполях. Всё тяжёлое — заранее, в cron или при сохранении, с записью результата в метаполе. Пример работы с базой и подготовленными запросами — в статье $wpdb в WordPress: безопасные запросы.

Ещё одна ловушка — сортировка по метаполю без индекса: на больших каталогах она замедляет список. Если записей тысячи, стоит вынести часто сортируемые значения в отдельную таблицу или денормализовать.

Типичные ошибки

Ошибки почти всегда одни и те же, и все они ловятся на ревью.

Ошибка Последствие Как правильно
Хук без привязки к типу Колонка появляется везде Указывать конкретный post_type
Вывод без экранирования XSS через метаполе esc_html / esc_attr
Сортировка без pre_get_posts Клик ничего не меняет Подменять orderby
Тяжёлые запросы в колонке Админка тормозит Данные из метаполей
Фильтр без проверки is_admin Ломается фронтенд Проверять контекст

И отдельно: не правьте ядро и не трогайте файлы плагинов — все доработки живут в своём плагине или дочерней теме, иначе обновление всё снесёт. Базовые приёмы работы с хуками — в статье хуки WordPress: actions и filters.

Колонки для своих типов записей

Если тип зарегистрирован вручную, хуки формируются по его имени: manage_{post_type}_posts_columns, manage_{post_type}_posts_custom_column, manage_edit-{post_type}_sortable_columns. Для таксономий есть аналогичные хуки на экране терминов.

Полезно сразу добавить фильтр по рубрике или своему полю: на кастомных типах записей стандартных фильтров почти нет, и редактору приходится искать вручную. Один выпадающий список экономит минуты каждый день.

Чек-лист внедрения

1. Определите, какие данные редактор ищет в списке чаще всего. 2. Добавьте 1–3 колонки через manage-хуки и экранируйте вывод. 3. Включите сортировку и подмените orderby в pre_get_posts. 4. Добавьте фильтры через restrict_manage_posts и обработайте их. 5. Проверьте, что фильтры не влияют на фронтенд. 6. Убедитесь, что в колонках нет тяжёлых запросов. 7. Проверьте список на большом объёме (200+ записей). 8. Прогоните код на копии сайта перед публикацией.

Для отладки используйте WP_DEBUG и Query Monitor: они покажут лишние запросы, которые появились в списке. Как это настроить — в статье WP_DEBUG и отладка WordPress.

TimeWeb

Частые вопросы про колонки в админке WordPress

Как добавить свою колонку в список записей?

Через фильтр manage_posts_columns (или manage_{тип}_posts_columns) добавьте ключ в массив колонок, а значение выведите в хуке manage_posts_custom_column (manage_{тип}_posts_custom_column). Внутри получите ID записи и выведите нужные данные через get_post_meta с экранированием.

Почему сортировка по колонке не работает?

Потому что колонку не объявили сортируемой или не подменили параметры запроса. Нужны два шага: добавить ключ в manage_edit-{тип}_sortable_columns и в pre_get_posts при нужном orderby задать meta_key и orderby (meta_value или meta_value_num).

Как добавить фильтр по метаполю над таблицей?

Вывести выпадающий список в хуке restrict_manage_posts, а в parse_query или pre_get_posts проверить параметр из $_GET (с sanitize_text_field) и добавить meta_query в запрос. Обязательно проверять is_admin и is_main_query, чтобы фильтр не затронул фронтенд.

Почему админка начала тормозить после новой колонки?

Скорее всего, в хуке вывода выполняются тяжёлые запросы или обращения к API на каждую строку. Выносите расчёты в cron или сохранение записи, а в колонке выводите готовое значение из метаполя — метаданные кешируются ядром.

Можно ли сделать сортировку по нескольким колонкам?

Да, но это уже сложнее: потребуется собрать orderby массивом и учесть несколько метаполей в meta_query. На практике двух-трёх сортируемых колонок достаточно; для сложных отчётов лучше отдельная выгрузка, чем перегруженный список.

Где хранить код — в теме или в плагине?

Лучше в своём небольшом плагине (или дочерней теме, если правки только для сайта). Плагин переживает смену темы, дочерняя тема — обновление родительской. Не правьте файлы ядра и установленных плагинов: изменения снесёт ближайшее обновление.

Вывод

Кастомные колонки и фильтры — дешёвая доработка, которая экономит время редакции каждый день. Добавьте 2–3 нужных колонки, включите сортировку, поставьте фильтр по ключевому полю — и админка станет рабочим инструментом, а не списком заголовков.

Если нужна доработка админки под ваш каталог — колонки, фильтры, отчёты, массовые действия — эту задачу можно передать одной команде. Посмотрите услуги разработки и поддержки сайтов, изучите портфолио проектов и почитайте блог о WordPress. Опишите задачу через форму контактов — предложим решение и рассчитаем стоимость.

Clearfy

Поделиться:
Telegram ВКонтакте