Кратко: список записей в админке 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.

Частые вопросы про колонки в админке 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. Опишите задачу через форму контактов — предложим решение и рассчитаем стоимость.



