Работая с кастомными типами записей в WordPress, часто возникает необходимость видеть дополнительные данные прямо в таблице админки — без необходимости открывать каждую запись. Например, если вы создаете сайт недвижимости с типом записей property, то удобно, чтобы в списке отображались цена, тип объекта, агент и другие мета-поля.
В этой статье разберем, как добавить кастомные колонки с метаданными для Custom Post Type (CPT) и реализовать сортировку по этим полям в административной панели WordPress.
Шаг 1. Подготовка класса для работы с CPT
Предположим, у вас уже есть зарегистрированный кастомный тип записи property и соответствующие мета-поля (например, price, type, agent).
Создадим или продолжим работу в классе, который отвечает за регистрацию и функционал вашего CPT — например, Property_Custom_Post_Type.
Чтобы добавить колонки, подключаем фильтры и экшены внутри метода register_hooks() вашего класса:
add_filter('manage_property_posts_columns', [$this, 'add_custom_columns']);
add_action('manage_property_posts_custom_column', [$this, 'render_custom_columns'], 10, 2);
add_filter('manage_edit-property_sortable_columns', [$this, 'sortable_columns']);
add_action('pre_get_posts', [$this, 'apply_custom_sorting']);
Шаг 2. Добавляем кастомные колонки в таблицу
Для начала нам нужно определить, какие колонки будут отображаться.
public function add_custom_columns($columns) {
// Сохраняем стандартные колонки
$new_columns = [];
// Добавляем кастомные поля
$new_columns['cb'] = $columns['cb'];
$new_columns['title'] = __('Название', 'textdomain');
$new_columns['price'] = __('Цена', 'textdomain');
$new_columns['type'] = __('Тип', 'textdomain');
$new_columns['agent'] = __('Агент', 'textdomain');
$new_columns['date'] = $columns['date'];
return $new_columns;
}
Теперь в таблице записей появятся новые колонки — но пока они пустые.
Шаг 3. Выводим данные метаполей в колонках
Чтобы наполнить эти колонки данными из метаполей, используем хук manage_property_posts_custom_column:
public function render_custom_columns($column, $post_id) {
switch ($column) {
case 'price':
$price = get_post_meta($post_id, 'price', true);
echo esc_html($price ? $price . ' $' : '—');
break;
case 'type':
$type = get_post_meta($post_id, 'property_type', true);
echo esc_html($type ?: '—');
break;
case 'agent':
$agent_id = get_post_meta($post_id, 'agent', true);
$agent_name = $agent_id ? get_the_title($agent_id) : '';
echo esc_html($agent_name ?: '—');
break;
}
}
Теперь админка покажет цену, тип и имя агента прямо в таблице записей.
Шаг 4. Добавляем сортировку по кастомным колонкам
Чтобы колонки можно было сортировать, нужно объявить их как сортируемые:
public function sortable_columns($columns) {
$columns['price'] = 'price';
$columns['type'] = 'property_type';
return $columns;
}
Теперь стрелочки сортировки появятся, но сама логика сортировки пока не работает — её нужно задать вручную.
Шаг 5. Реализуем сортировку по метаданным
Сортировка в WordPress происходит через модификацию запроса WP_Query до его выполнения. Для этого используем хук pre_get_posts:
public function apply_custom_sorting($query) {
// Работает только в админке
if (!is_admin() || !$query->is_main_query()) {
return;
}
$orderby = $query->get('orderby');
if ($orderby === 'price') {
$query->set('meta_key', 'price');
$query->set('orderby', 'meta_value_num'); // сортировка по числовому значению
}
if ($orderby === 'property_type') {
$query->set('meta_key', 'property_type');
$query->set('orderby', 'meta_value');
}
}
Теперь администратор может кликнуть по заголовку колонки и отсортировать список объектов по цене или типу.
Шаг 6. Оптимизация и масштабирование
Если у вас несколько CPT (например, property, agent, offer), стоит сделать этот механизм универсальным.
Для этого можно добавить аргумент в фильтры, чтобы динамически подставлять имя типа записи, и использовать единый класс для разных CPT.
Результат
После выполнения этих шагов, вы получите:
✅ Дополнительные колонки в админке WordPress для вашего Custom Post Type
✅ Автоматический вывод данных из метаполей (цена, тип, агент и т.д.)
✅ Полноценную сортировку по кастомным полям
✅ Удобную и информативную таблицу объектов прямо в админке
Это значительно упрощает работу контент-менеджеров и повышает производительность при управлении записями в WordPress.
Полезный совет
Если вы часто работаете с кастомными постами и метаданными, рекомендую объединять всю логику — регистрацию CPT, метабоксов, колонок и сортировки — в отдельные классы. Это делает проект структурированным, а код — легко поддерживаемым.
Заключение
Добавление кастомных колонок и сортировки в WordPress — мощный способ улучшить UX админки и сделать управление контентом гораздо удобнее.
Пара фильтров и немного кода — и ваша админка превращается в полноценную панель управления данными.