На скриншоте ниже наглядный пример того, что у нас должно будет в результате получиться.
В качестве произвольного поля я взял количество просмотров записи, ну, и если вы кликнете по заголовку таблицы «Просмотры», то посты соответственно будут сортироваться по возрастанию или убыванию просмотров (если кликнуть второй раз).
Другие фильтры записей при этом будут работать как и полагается (в моём случае это фильтр по месяцам, рубрикам + постраничная навигация, когда записей станет много).
В этой статье я хочу разобрать всё ну очень подробно, поэтому если что-то вам кажется пустяковым — просто переходите к следующей главе.
Создание произвольного поля
Тут есть два варианта.
- Если вы создаёте что-то с нуля, то вы можете добавить просмотры при помощи стандартного метабокса «Произвольные поля».
- Либо для удобства вы можете добавить свой собственный метабокс, в котором можно указать просмотры, про метабоксы подробно тут.
Добавление колонки
Про колонки уже подробно было рассмотрено здесь, поэтому сейчас вкратце. Вставляете этот код в ваш 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' } } |
И результат:
Источник: misha.blog