Сделать пользовательскую колонку сортируемой

6 февр. 2018 г., 21:32:52
Просмотры: 27.6K
Голосов: 17

Я добавил пользовательскую колонку к произвольному типу записи, и она работает нормально. Я просто хочу отсортировать имена по заголовку, поэтому я попробовал это:

function sortable_custom_columns( $columns ) {
    $columns['custom_column'] = 'title';
    return $columns;
}
add_filter( 'manage_edit-custom_sortable_columns', 'sortable_custom_columns' );

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

function location_column_content( $column, $post_id ) {
    switch ( $column ) {
        case 'practice_name':
            $location_post_meta = get_post_meta( $post_id );
            $practice_post_id = $location_post_meta['practice_id'][0];
            echo '<a href="' . get_edit_post_link( $practice_post_id ) . '">' . get_the_title( $practice_post_id ) . '</a>';
            break;
    }

}
add_action( 'manage_sf-location_posts_custom_column', 'location_column_content', 10, 2 );

Это имеет смысл? Есть какие-нибудь мысли по этому поводу? Спасибо

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

Что делать, если я использую значение элемента? Например, $item->get_meta( '_st_check_in' ); Как его отсортировать?

Daniel Muñoz Daniel Muñoz
9 февр. 2021 г. 19:30:21

@DanielMuñoz не публикуйте комментарии в качестве решения вопроса. Я понимаю, что у вас всего 1 репутация и вы пока не можете комментировать чужие вопросы, но это не повод спамить на сайте. Если вы продолжите, автоматические системы пометят вас как спамера и заблокируют. Я не смог понять, к какому вопросу относился ваш комментарий, поэтому перенес его к самому вопросу

Tom J Nowell Tom J Nowell
9 февр. 2021 г. 20:03:33
Все ответы на вопрос 4
5
42

Обязательно замените MY_POST_TYPE, MY_CUSTOM_COLUMN и MY_META_KEY на реальные значения.

Сначала добавьте свой пользовательский столбец. Удалите дату и снова установите ее, чтобы она оставалась в последнем столбце. Вы можете пропустить этот шаг.

<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
    // сохраняем дату в переменную
    $date = $columns['date'];
    // удаляем столбец 'date'
    unset( $columns['date'] ); 
    // при необходимости удаляем любой столбец
    // unset( $columns['comments'] );

    // добавляем свой столбец как новый элемент массива и задаем текст заголовка
    $columns['MY_CUSTOM_COLUMN'] = __('Заголовок пользовательского столбца');

    $columns['date'] = $date; // снова добавляем столбец 'date' после пользовательского столбца

    return $columns;
}
?>

Во-вторых, сделайте ваш столбец сортируемым с помощью фильтра manage_edit-{$post_type}_sortable_columns (пока не документирован).

<?php
function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}
?>

В-третьих, заполните ячейки столбца.

<?php
function my_populate_custom_columns( $column, $post_id )
{
    switch ( $column ) {
        case 'MY_CUSTOM_COLUMN':
            echo get_post_meta($post_id, 'MY_META_KEY', true);
            break;
        case 'MAYBE_ANOTHER_CUSTOM_COLUMN':
            // дополнительный код
            break;
    }
}
?>

Теперь вы готовы к сортировке этого столбца.

Примечание: если вы не проверите meta_query на пустые (несуществующие) значения, ваш столбец будет показывать только записи с (непустыми) значениями метаполей, пока они не будут отсортированы по умолчанию или по другому столбцу.

<?php
function my_sort_custom_column_query( $query )
{
    $orderby = $query->get( 'orderby' );

    if ( 'MY_CUSTOM_COLUMN' == $orderby ) {

        $meta_query = array(
            'relation' => 'OR',
            array(
                'key' => 'MY_META_KEY',
                'compare' => 'NOT EXISTS', // см. примечание выше
            ),
            array(
                'key' => 'MY_META_KEY',
            ),
        );

        $query->set( 'meta_query', $meta_query );
        $query->set( 'orderby', 'meta_value' );
    }
}
?>

Теперь применим фильтры и действия. Убедитесь, что вы не на фронтенде, на нужной странице и выбран правильный тип записи:

<?php
global $pagenow;

if ( is_admin() && 'edit.php' == $pagenow && 'MY_POST_TYPE' == $_GET['post_type'] ) {

    // управление столбцами
    add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );

    // делаем столбцы сортируемыми
    add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );

    // заполняем ячейки столбцов
    add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );

    // настраиваем запрос для сортировки
    add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}

?>
7 февр. 2018 г. 15:54:37
Комментарии

Это по-прежнему отлично работает на сегодняшний день.

MattFisch MattFisch
2 февр. 2022 г. 16:35:23

manage_edit-{$post_type}_sortable_columns документирован как manage_{$this->screen->id}_sortable_columns, где $this->screen->id в данном случае относится к edit-post, edit-page или edit-<post_type>.

KittMedia KittMedia
6 мая 2022 г. 11:19:34

Альтернативой использованию meta_query является простое использование $query->set( 'meta_key' , 'MY_META_KEY' );. Это позволит избежать проблемы exist/not exists.

Jared Jared
21 дек. 2022 г. 17:11:24

Если значения в вашей пользовательской колонке являются числами, вам, скорее всего, следует использовать $query->set( 'orderby', 'meta_value_num' ) вместо $query->set( 'orderby', 'meta_value' ).

Boycott A.I. Boycott A.I.
8 сент. 2023 г. 15:12:34

Совет: Внутри функции _sortable_columns вы можете передавать массив с направлением сортировки по умолчанию, например ['name', false, 'Name'], а не только строку, но это не задокументировано.

ViliusL ViliusL
3 окт. 2023 г. 09:40:36
1

Сделать колонки сортируемыми

По умолчанию новые пользовательские колонки не являются сортируемыми, что затрудняет поиск нужных данных. Для сортировки пользовательских колонок WordPress предоставляет ещё один фильтр manage_edit-post_sortable_columns, который позволяет указать, какие колонки можно сортировать.

Когда это действие выполняется, функция получает параметр со списком всех текущих сортируемых колонок. Добавление ваших новых пользовательских колонок в этот список сделает их сортируемыми. Значение, которое вы задаёте, будет использоваться в URL, чтобы WordPress понимал, по какой колонке производить сортировку.

Следующий код позволяет сортировать по пользовательской колонке meta:

// Регистрация колонки как сортируемой
function register_sortable_columns( $columns ) {
    $columns['meta'] = 'Custom Column';
    return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );
22 июн. 2021 г. 20:14:09
Комментарии

Я ценю усилия, которые вы вложили в это описание! Но данное решение, в том виде, в каком оно есть, похоже, повторяет фрагмент кода, который уже упоминался в вопросе как неэффективный для достижения их цели

bosco bosco
22 июн. 2021 г. 21:49:27
0

Начиная с версии WordPress 6.3.0, параметр $sortable_columns стал многомерным массивом, в котором теперь также можно указывать сокращения, текст для сортировки и начальный порядок сортировки. Это означает, что вам нужно обновить функцию my_set_sortable_columns в примере Макса Юдина с этого:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}

На это:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = array(
        'MY_CUSTOM_COLUMN', // Внутреннее название колонки, совпадает с ключом массива
        false, // Игнорировать инициализацию сортировки по умолчанию
        __('Текст заголовка колонки'), // Короткое название колонки (сокращение) для атрибута `abbr`
        __('Таблица отсортирована по пользовательской колонке.') // Переводимая строка с кратким описанием текущей сортировки
    );
    return $columns;
}

Если вы хотите установить начальный порядок сортировки для вашей колонки, просто измените второй параметр с false на true и добавьте 5-й параметр asc или desc, как показано ниже:

$columns['MY_CUSTOM_COLUMN'] = array(
    'MY_CUSTOM_COLUMN', // Внутреннее название колонки, совпадает с ключом массива
    true, // Инициализировать с указанным порядком
    __('Текст заголовка колонки'), // Короткое название колонки (сокращение) для атрибута `abbr`
    __('Таблица отсортирована по пользовательской колонке.'), // Переводимая строка с кратким описанием текущей сортировки
    'asc' // Инициализировать в порядке возрастания, можно также указать 'desc'
);
31 июл. 2024 г. 18:26:18
1
-1

Вам нужно отсортировать таблицу, используя pre_get_posts. Хорошие пошаговые инструкции можно найти на Envato Tips.

6 февр. 2018 г. 22:09:56
Комментарии

Это хороший комментарий! Большинству людей потребуется изменить основной запрос, чтобы достичь желаемого результата сортировки. Ответы выше только фильтруют, какие столбцы МОГУТ быть отсортированы (они не выполняют логику сортировки). Вам нужен pre_get_posts!

Chad Reitsma Chad Reitsma
3 февр. 2025 г. 21:47:32