Сделать пользовательскую колонку сортируемой
Я добавил пользовательскую колонку к произвольному типу записи, и она работает нормально. Я просто хочу отсортировать имена по заголовку, поэтому я попробовал это:
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 );
Это имеет смысл? Есть какие-нибудь мысли по этому поводу? Спасибо

Обязательно замените 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' );
}
?>

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

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

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

Сделать колонки сортируемыми
По умолчанию новые пользовательские колонки не являются сортируемыми, что затрудняет поиск нужных данных. Для сортировки пользовательских колонок 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' );

Начиная с версии 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'
);

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