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