Недавно была задача – добавить в WordPress в админку страницы постов свои колонки с информацией из кастомных мета-полей. Как это сделать можно посмотреть здесь.
Сейчас мы сделаем так, чтобы эти самые конки можно было сортировать.
Задача будет состоять из 2-х этапов:
- 1 этап – делаем колонки сортируемыми (хук manage_edit-{post_type}_sortable_columns)
- 2 этап – настраиваем саму сортировку
Мы в этот раз будем использовать 2 хука – manage_edit-{post_type}_sortable_columns (на самом деле производное от хука – manage_{$this->screen->id}_sortable_columns ) и pre_get_post.
1 этап – делаем колонки сортируемыми
add_filter( 'manage_edit-kuhni_sortable_columns', 'rb_make_column_sortable' );
function rb_make_column_sortable( $columns ) {
$columns['price'] = 'price_base'; //название параметра в url
$columns['price_std'] = 'price_std';
$columns['price_pr'] = 'price_pr';
return $columns;
}Ура! У нас получилась сортировка, давайте посмотрим как это выглядит:

Смотрите – уже можно нажимать на заголовок колонки и порядок постов будет меняться, но есть один важный момент, что сама сортировка пока будет некорректной. Вот для этого-то нам и нужен будет этап 2.
2 этап – подключаем сортировку
add_action( 'pre_get_posts', 'rb_sort_custom_column_query' );
function rb_sort_custom_column_query( $query ) {
//проверяем, что мы в админке и тип записи тот, что нам нужен
if ( ! is_admin() && $query->get( 'post_type' ) != 'kuhni' ) {
return;
}
$orderby = $_GET[ 'orderby' ];
if ( $orderby ) {
$query->set( 'meta_key', $orderby );
$query->set( 'orderby', 'meta_value_num' );
}
}В итоге мы получаем из $_GET – нужное нам значение сортировки, а точнее понимание по значениям из какого мета-поля мы будем сортировать посты и добавляем в глобальную переменную это условие сортировки. Также мы указываем, что сортировка будет осуществляться числовых значений, а не текстовых – $query->set( ‘orderby’, ‘meta_value_num’ );

И наконец-то всё заработало так как мы и ожидали. Отличная новость)