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


Недавно была задача – добавить в WordPress в админку страницы постов свои колонки с информацией из кастомных мета-полей. Как это сделать можно посмотреть здесь.

Сейчас мы сделаем так, чтобы эти самые конки можно было сортировать.

Задача будет состоять из 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;
}

Ура! У нас получилась сортировка, давайте посмотрим как это выглядит:

сортировка по значениям из мета-полей в админке WordPress - предварительный вариант

Смотрите – уже можно нажимать на заголовок колонки и порядок постов будет меняться, но есть один важный момент, что сама сортировка пока будет некорректной. Вот для этого-то нам и нужен будет этап 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’ );

сортировка по значениям из мета-полей в админке WordPress

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