Статьи

Совет: сделайте свой столбец сортируемым

В недавней статье Клаудио Симеоне он продемонстрировал, как можно добавить дополнительные столбцы к своему сообщению или пользовательский тип сообщения, экраны администратора (или удалить существующие). В этом кратком совете я основываюсь на этом, показывая вам, как сделать ваши вновь созданные столбцы сортируемыми.


Чтобы сообщить WordPress, какие столбцы вы хотите зарегистрировать как сортируемые, вам нужен этот фильтр :

1
manage_{$screen->id}_sortable_column

Для сообщений и страниц, $screen->id равно ‘ edit-post ‘ и ‘ edit-page ‘ соответственно. Как правило, для типа записи с именем « my-post-type » это « edit-my-post-type ».

Фильтр передает массив с именами сортируемых столбцов в качестве ключей, а порядок сортировки в качестве значения. Точнее, значения определяют, какой параметр ‘ orderby ‘ установлен как в запросе, который заполняет таблицу. Точно так же, как вы можете удалять столбцы, вы также можете сделать столбцы «нестабильными», удалив их из этого массива. Давайте посмотрим на пример:


Следуя статье Клаудио , предположим, что мы добавили столбец «ломтики» к нашему типу записи «торт», что мы можем сделать следующим образом:

1
2
3
4
5
add_filter(‘manage_edit-cake_columns’, ‘my_extra_cake_columns’);
function my_extra_cake_columns($columns) {
    $columns[‘slices’] =__(‘Slices’,’myplugindomain’);
    return $columns;
}

И мы добавили содержимое для столбца следующим образом:

1
2
3
4
5
6
7
8
add_action( ‘manage_cake_posts_custom_column’, ‘my_cake_column_content’, 10, 2 );
function my_cake_column_content( $column_name, $post_id ) {
    if ( ‘slices’ != $column_name )
        return;
    //Get number of slices from post meta
    $slices = get_post_meta($post_id, ‘slices’, true);
    echo intval($slices);
}

Я сохранил фрагменты как пост-мета, но ваши столбцы могут быть заполнены другими данными.


Теперь мы регистрируем наш пользовательский столбец как «сортируемый». Как упоминалось выше, мы используем фильтр manage_{$screen->id}_sortable_column . $screen->id в этом случае — « edit-cake ».

1
2
3
4
5
6
7
8
9
add_filter( ‘manage_edit-cake_sortable_columns’, ‘my_sortable_cake_column’ );
function my_sortable_cake_column( $columns ) {
    $columns[‘slices’] = ‘slice’;
 
    //To make a column ‘un-sortable’ remove it from the array
    //unset($columns[‘date’]);
 
    return $columns;
}

Ключ массива $columns указывает сортируемый столбец, а его значение сообщает WordPress, на что указывать ‘ orderby ‘ в запросе. Если бы это значение было одним из « orderby », изначально понятных WordPress (к ним относятся « title », « date », « modified », « comment_count » или действительно любые другие, перечисленные в WP_Query в кодексе WordPress), мы могли бы остановите здесь. Исключением из этого правила, как и в этом примере, являются параметры ‘ meta_value ‘ и ‘ meta_value_num ‘, которые также требуют от нас установки мета-ключа.

Если мы хотим отсортировать по мета-значению или каким-либо другим способом, WordPress не понимает автоматически, вы должны сказать ему, что вы имеете в виду, упорядочив по «слайсу». Если вы делаете заказ по мета посту, самый простой способ сделать это — подключиться к действию pre_get_posts . Это передает объект запроса, который мы можем изменить. Обратите внимание, что это действие выполняется для всех запросов по умолчанию (спереди и сзади). Хотя это вряд ли вызовет какие-либо проблемы, если только вы не хотите, чтобы WordPress интерпретировал orderby установив для него также «slice», это хорошая идея — выполнять запросы только на стороне администратора.

01
02
03
04
05
06
07
08
09
10
11
12
add_action( ‘pre_get_posts’, ‘my_slice_orderby’ );
function my_slice_orderby( $query ) {
    if( ! is_admin() )
        return;
 
    $orderby = $query->get( ‘orderby’);
 
    if( ‘slice’ == $orderby ) {
        $query->set(‘meta_key’,’slices’);
        $query->set(‘orderby’,’meta_value_num’);
    }
}

Это проверяет, упорядочен ли наш запрос по ‘slice’, и если это так, он сообщает WordPress о числовом упорядочении по значению мета-записи post ‘slices’. Если вы хотите отсортировать значение по алфавиту, используйте « meta_value », а не « meta_value_num ».

$query является объектом WP_Query , поэтому все, что вы можете отсортировать с помощью этого объекта, позволяет сортировать столбцы. Для чего-то более сложного вам нужно подключиться к крюку posts_orderby (или post_clauses ), но это выходит за рамки этого быстрого совета.

Примечание. Если в сообщении нет значения, сохраненного для этого метакла, то оно не будет отображаться при сортировке по этому метаключу. Это отличается от записи, в которой 0 хранится как мета-значение.