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

В этом уроке покажу, как добавить колонку с количеством просмотров в таблицу с постами и отсортировать её по значению произвольного поля.

Добавляем сортируемую колонку с количеством просмотров в админку WordPress

В качестве произвольного поля я взял количество просмотров записи, ну, и если вы кликнете по заголовку таблицы «Количество просмотров», то посты соответственно будут сортироваться по возрастанию или убыванию просмотров (если кликнуть второй раз).

Другие фильтры записей и постраничная навигация при этом будут работать как обычно.

Также хочу порекомендовать вам свой видеокурс по созданию темы WordPress на основе готовой HTML-вёрстки ⚡️

1. Добавление колонки

Про добавление колонок для типов записей, таксономий, пользователей, комментариев и так далее у меня есть подробнейший урок.

Сейчас же добавим колонку с выводом значения произвольного поля для обычных записей WordPress.

add_filter( 'manage_edit-post_columns', 'true_add_post_columns', 25 ); 
 
function true_add_post_columns( $my_columns ){
 
	$my_columns[ 'prosmort' ] = 'Количество просмотров';
	return $my_columns;
 
}
 
add_action( 'manage_posts_custom_column', 'true_fill_post_columns', 25 );
 
function true_fill_post_columns( $column ) {
 
	if( 'prosmort' == $column ) {
		$views = get_post_meta( get_the_ID(), 'views', true );
		echo $views ? $views : 0; // выводим 0, если произвольное поле не заполнено
	}
 
}

Не знаете, куда вставлять код из урока?

Добавление колонки с количеством просмотров записи в WordPress

2. Делаем колонку сортируемой

А вот нам придётся познакомиться с хуком manage_{screen_id}_sortable_columns, значение {screen_id} для страницы записей будет edit-post, а значит и хук примет вид manage_edit-post_sortable_columns. Чтобы узнать {screen_id} можете воспользоваться функцией get_current_screen().

Или можете например воспользоваться таблицей:

ЭкранХук
Записиmanage_edit-post_sortable_columns
Страницыmanage_edit-page_sortable_columns
Произвольные типы постовmanage_edit-{тип поста}_sortable_columns
Рубрикиmanage_edit-category_sortable_columns
Меткиmanage_edit-post_tag_sortable_columns
Произвольные таксономииmanage_edit-{таксономия}_sortable_columns
Библиотека файловmanage_upload_sortable_columns
Комментарииmanage_edit-comments_sortable_columns
Пользователиmanage_users_sortable_columns

Суть легка – в массив сортируемых колонок добавляем нашу:

add_filter( 'manage_edit-post_sortable_columns', 'true_sortable_column' );
 
function true_sortable_column( $columns ){
 
	$columns[ 'prosmort' ] = 'views'; //  $columns[ 'ID колонки' ] = 'Значение параметра orderby'
 
	// Кстати, здесь вы также можете сделать любую колонку несортируемой, просто удалите её из массива
	// unset( $columns[ 'date' ] );
 
	return $columns;
}

После этого наша колонка станет сортируемой, но пока что ничего не будет работать до тех пор, пока мы не перейдём к следующему шагу.

3. Сортируем посты

О, а вот тут конечно интересно. Код сильно зависит от того, что конкретно вы будете сортировать. В этом примере мы сортируем посты (записи) и поэтому все наши старания ограничатся использованием хука pre_get_posts.

add_action( 'pre_get_posts', 'true_orderby_prosmotr' );
 
function true_orderby_prosmotr( $query ) {
 
	// так как сортировка будет осуществляться только в админке
	if( ! is_admin() ) {
		return;
	}
 
	// получаем значение параметра сортировки
	$orderby = $query->get( 'orderby');
 
	if( 'views' == $orderby ) { // 'views' - параметр в GET-запросе
		$query->set( 'meta_key', 'prosmort' ); // 'prosmort' - название произвольного поля
		$query->set( 'orderby', 'meta_value_num' ); // если сортировка не по числовому значению, а по алфавиту, замените на 'meta_value'
	}
}

Заметки:

  • Вам не нужно писать этот код для стандартных значений параметра orderby, например, если вы хотите отсортировать пользователей по дате их регистрации, то скипаем смело этот шаг.
  • Фильтр pre_get_posts у нас сработает для любых типов постов – записей, страниц, библиотеки файлов и любых произвольных.
  • Для пользователей можете использовать pre_get_users.
  • Для комментариев pre_get_comments.
  • Для рубрик, меток и таксономий – pre_get_terms.

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

Ну и ещё раз то, что у нас получилось:

Добавляем сортируемую колонку с количеством просмотров в админку WordPress

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с сайтом или разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда будем рады вам помочь!

Комментарии — 4

Комментирование этого поста более не доступно.