Создание колонки с произвольным полем и сортировка записей по его значению

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

Сортируем записи по произвольному полю в админке WP

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

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

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

Создание произвольного поля

Тут есть два варианта.

  1. Если вы создаёте что-то с нуля, то вы можете добавить просмотры при помощи стандартного метабокса «Произвольные поля».
    Добавление произвольного поля в WordPress
  2. Либо для удобства вы можете добавить свой собственный метабокс, в котором можно указать просмотры, про метабоксы подробно тут, также есть готовое решение здесь.

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

Про колонки уже подробно было рассмотрено здесь, поэтому сейчас вкратце. Вставляете этот код в ваш functions.php, после чего колонка должна будет появиться (но пока что без возможности сортировки).

add_filter( 'manage_edit-post_columns', 'true_add_post_columns_2', 10, 1 ); // manage_edit-{тип поста}_columns, то есть вы можете добавлять колонку не только для записей
add_action( 'manage_posts_custom_column', 'true_fill_post_columns_2', 10, 1 );
 
/* добавление колонки */
function true_add_post_columns_2( $my_columns ){
	$my_columns['prosmort'] = 'Просмотры';
	return $my_columns;
}
 
/* заполнение колонки */
function true_fill_post_columns_2( $column ) {
	global $post;
	switch ( $column ) {
		case 'prosmort':
			echo ( $x = get_post_meta($post->ID, 'prosmort', true) ) ? $x : 0; // это простое условие, если произвольного поля не существует, то выводим 0
			break;
	}
}

В результате у меня получилось:

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

Посты пока что не сортируются, но мы это сейчас поправим.

Сортировка по произвольному полю

Отправляем следом в functions.php код:

add_filter( 'manage_edit-post_sortable_columns', 'true_sort_prosmotr' ); // manage_edit-{тип поста}_sortable_columns
add_action( 'pre_get_posts', 'true_orderby_prosmotr' );
 
function true_sort_prosmotr( $columns ) {
    $columns['prosmort'] = 'views'; //  $columns['ID колонки'] = 'Значение параметра orderby'
 
    //Кстати, здесь вы также можете сделать любую колонку несортируемой, просто удалите её из массива
    //unset($columns['date']);
 
    return $columns;
}
 
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'
	}
}

И результат:

Сортируем записи по произвольному полю в админке WP
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

По теме

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...