Как сделать сортируемую колонку с таксономией в таблице записей WordPress

14 авг. 2013 г., 01:14:17
Просмотры: 13.6K
Голосов: 8

Я хочу добавить пользовательскую колонку в таблицу записей кастомного типа в админке 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 для решения этой задачи.

4
Комментарии

Вау, после создания этого поста я только что заметил Сортируемые колонки в админке, когда данные не из post_meta в разделе связанных тем. Извините, что не поискал лучше перед вопросом, возможно, это дубликат. Хотя прямой ответ был бы на другом сайте... Сортируемые колонки таксономий от Scribu

Michael Ecklund Michael Ecklund
14 авг. 2013 г. 01:17:11

Версия 3.5 добавила аргумент show_admin_column для register_taxonomy, который по сути делает всё это за вас, не нужно делать это вручную.

Milo Milo
21 окт. 2013 г. 18:23:02

@Milo Спасибо, что указали на это! Я не знал об этом параметре. Определённо делает всё намного проще. Однако, похоже, что с вашим методом сортировка не работает. Ваш метод покрывает шаги 1 и 2 из моего ответа.

Michael Ecklund Michael Ecklund
21 окт. 2013 г. 18:34:23

Ах, точно, он позволяет фильтровать по термину, но не сортирует по термину.

Milo Milo
21 окт. 2013 г. 18:35:58
Все ответы на вопрос 2
0
22

Для добавления настраиваемой сортируемой колонки в таблицу WP_List_Table вашего типа записи в админке WordPress, необходимо выполнить следующие действия:

  1. Замените все вхождения YOUR-POST-TYPE-NAME на имя вашего типа записи.
  2. Замените все вхождения YOUR-TAXONOMY-NAME на имя вашей таксономии.
  3. Замените все вхождения YOUR COLUMN NAME на название вашей колонки.
  4. Замените все вхождения 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 за публикации Кастомные сортируемые колонки и Сортируемые колонки таксономий для этого ответа на оригинальный вопрос Кастомная колонка таблицы, сортируемая по запросу таксономии.

21 окт. 2013 г. 18:13:31
0
-2

Это можно сделать гораздо проще с помощью одного фильтра:

/**
 * Сортировка по терминам таксономии
 *
 * Добавляет сортировку по столбцу для пользовательской таксономии в представлении редактирования пользовательского типа записи в 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.

10 сент. 2020 г. 17:54:32