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

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

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

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

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

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, если произвольное поле не заполнено
	}
 
}

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

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

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

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

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

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'
	}
}

Заметки:

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

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

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии