Как сделать сортируемую колонку с таксономией в таблице записей WordPress
Я хочу добавить пользовательскую колонку в таблицу записей кастомного типа в админке WordPress.
Я изучил множество вопросов и ответов на WPSE, включая эту статью. Однако, большинство решений касаются запросов по метаполям.
Мне нужно добавить значение таксономии (по сути категорию) в таблицу записей кастомного типа.
Я хочу, чтобы колонка была сортируемой, но не понимаю, как настроить запрос для сортировки.
Добавляем заголовок колонки:
function mbe_column_titles($columns){
$columns['title'] = 'Часто задаваемый вопрос';
$columns['mbe-faq-category'] = 'Категория';
return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');
Добавляем значения в строки таблицы:
function mbe_column_rows($column_name, $post_id){
if($column_name == 'mbe-faq-category'){
$categories = wp_get_object_terms($post_id, 'mbe-faq-categories');
$the_category = array();
if($categories){
foreach($categories as $category){
$the_category[] = $category->name;
}
}
echo join(', ', $the_category);
}
}
add_action('manage_mbe-faqs_posts_custom_column', 'mbe_column_rows', 10, 2);
Делаем колонку сортируемой:
function mbe_sortable_columns($columns){
$columns['mbe-faq-category'] = 'mbe-faq-category';
return $columns;
}
add_filter('manage_edit-mbe-faqs_sortable_columns', 'mbe_sortable_columns');
Я застрял на реализации сортировки по категории FAQ. Предполагаю, что нужен запрос к таксономии. Мне даже стыдно показывать свои попытки это реализовать - ничего не работает. Хотелось бы использовать фильтр pre_get_posts
для решения этой задачи.

Для добавления настраиваемой сортируемой колонки в таблицу WP_List_Table
вашего типа записи в админке WordPress, необходимо выполнить следующие действия:
- Замените все вхождения
YOUR-POST-TYPE-NAME
на имя вашего типа записи. - Замените все вхождения
YOUR-TAXONOMY-NAME
на имя вашей таксономии. - Замените все вхождения
YOUR COLUMN NAME
на название вашей колонки. - Замените все вхождения
YOUR-COLUMN-SLUG
на слаг вашей колонки.
Шаг 1
Добавление дополнительных колонок в таблицу админки WordPress
if(!function_exists('mbe_change_table_column_titles')){
function mbe_change_table_column_titles($columns){
unset($columns['date']);// временно удаляем, чтобы добавить кастомную колонку перед датой
$columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
$columns['date'] = 'Дата';// возвращаем колонку с датой
return $columns;
}
add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}
Шаг 2
Добавление связанных терминов таксономии в кастомную колонку таблицы админки WordPress
if(!function_exists('mbe_change_column_rows')){
function mbe_change_column_rows($column_name, $post_id){
if($column_name == 'YOUR-COLUMN-SLUG'){
echo get_the_term_list($post_id, 'YOUR-TAXONOMY-NAME', '', ', ', '').PHP_EOL;
}
}
add_action('manage_YOUR-POST-TYPE-NAME_posts_custom_column', 'mbe_change_column_rows', 10, 2);
}
Шаг 3
Включение сортировки для кастомной колонки таблицы админки WordPress
if(!function_exists('mbe_change_sortable_columns')){
function mbe_change_sortable_columns($columns){
$columns['YOUR-COLUMN-SLUG'] = 'YOUR-COLUMN-SLUG';
return $columns;
}
add_filter('manage_edit-YOUR-POST-TYPE-NAME_sortable_columns', 'mbe_change_sortable_columns');
}
Шаг 4
Модификация post_clauses
для сортировки кастомной колонки по терминам таксономии
if(!function_exists('mbe_sort_custom_column')){
function mbe_sort_custom_column($clauses, $wp_query){
global $wpdb;
if(isset($wp_query->query['orderby']) && $wp_query->query['orderby'] == 'YOUR-COLUMN-SLUG'){
$clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= "AND (taxonomy = 'YOUR-TAXONOMY-NAME' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC)";
if(strtoupper($wp_query->get('order')) == 'ASC'){
$clauses['orderby'] .= 'ASC';
} else{
$clauses['orderby'] .= 'DESC';
}
}
return $clauses;
}
add_filter('posts_clauses', 'mbe_sort_custom_column', 10, 2);
}
Шаг 5 (БОНУС)
Настройка ширины кастомных колонок таблицы админки WordPress
if(!function_exists('mbe_print_admin_styles')){
function mbe_print_admin_styles(){
if(!is_admin()){
return false;
}
global $pagenow;
if($pagenow == 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] == 'YOUR-POST-TYPE-NAME'){
echo '
<style type="text/css">
.column-YOUR-COLUMN-SLUG{
width: 10%;
}
</style>
'.PHP_EOL;
}
}
add_action('wp_print_scripts', 'mbe_print_admin_styles');
}
Благодарности @goto10
за вопрос Сортируемые колонки админки, когда данные не из post_meta и @scribu
за публикации Кастомные сортируемые колонки и Сортируемые колонки таксономий для этого ответа на оригинальный вопрос Кастомная колонка таблицы, сортируемая по запросу таксономии.

Это можно сделать гораздо проще с помощью одного фильтра:
/**
* Сортировка по терминам таксономии
*
* Добавляет сортировку по столбцу для пользовательской таксономии в представлении редактирования пользовательского типа записи в WordPress.
*
* Примечание: Замените значения {post_type} и {taxonomy} ниже.
*/
add_filter( 'manage_edit-{post_type}_sortable_columns', function( $sortable_columns ) {
$sortable[ 'taxonomy-{taxonomy}' ] = ['orderby', 'asc'];
return $sortable;
}, 10, 1 );
Замените {post_type}
и {taxonomy}
на тип записи и таксономию, с которыми вы работаете. В результате вы получите пользовательский столбец в вашем пользовательском типе записи, который можно сортировать, и использовать для упорядочивания записей в таблице WP_List_Table
.
