Сортировка записей по произвольным полям в консоли управления WordPress
В прошлый раз мы говорили о том как немного упростить жизнь контент-менеджера с помощью фильтрации по таксономиям списка записей WordPress. Сегодня мы пойдём дальше, добавим в список записей колонку со значениями из произвольных полей (custom fields) и сделаем по этим данным сортировку записей.
Сразу поясню, речь идёт о консоли управления WordPress. Мы будем делать сортировку записей в листинге записей для администраторов и контент-менеджеров.
Понятно, что обычному блогу вряд ли когда-то это всё пригодится, а вот для различных каталогов, баз данных, интернет-магазинов возможность видеть в списке записей нужные произвольные часто бывает очень даже удобно и полезно.
Формулируем задачу.
Имеется тип данных (CPT) — portfolio с несколькими записями, каждая из которых содержит произвольное поле price с числовым значением. Необходимо в листинге записей вывести колонку с ценами с возможностью сортировки по-возрастанию и убыванию относительно значений price. Говоря проще, контент-менеджер должен иметь возможность сортировки записей от дешёвых к дорогим и наоборот.
1. Регистрируем в WordPress новую колонку с помощью хука manage_edit-${post_type}_columns. Где ${post_type} — это тип данных, для которого мы регистрируем новую колонку. В нашем примере для portfolio — manage_edit-portfolio_columns. В $columns[‘price’] мы задаём заголовок колонке, в нашем случае это «Цена».
add_filter('manage_edit-portfolio_columns', 'my_extra_portfolio_columns'); function my_extra_portfolio_columns($columns) { $columns['price'] = 'Цена'; return $columns; }
2. Выводим в созданную колонку мета-данные из произвольного поля «price».
add_action( 'manage_portfolio_posts_custom_column', 'my_portfolio_column_content', 10, 2 ); function my_portfolio_column_content( $column_name, $post_id ) { if ( 'price' != $column_name ) return; $price = get_post_meta($post_id, 'price', true); echo intval($price); }
3. Делаем сортировку с помощью фильтра manage_{$screen->id}_sortable_column. Где {$screen->id} в нашем случае edit-portfolio. Чтобы сделать невозможной дефолтную сортировку по дате, расскоментируйте строку unset($columns[‘date’]);
add_filter( 'manage_edit-portfolio_sortable_columns', 'my_sortable_portfolio_column' ); function my_sortable_portfolio_column( $columns ) { $columns['price'] = 'price'; // unset($columns['date']); return $columns; }
4. Новая сортировка по умолчанию.
add_action( 'pre_get_posts', 'my_price_orderby' ); function my_price_orderby( $query ) { if( ! is_admin() ) return; $orderby = $query->get( 'orderby'); if( 'price' == $orderby ) { $query->set('meta_key','price'); $query->set('orderby','meta_value_num'); } }
Конечно, это самый простой и примитивный пример, который скорее даст лишь общие представления о работе с контентом в WordPress и покажет некоторые способы упрощения управления им.
Фулстек веб‑разработчик, специализируюсь на платформе WordPress
Подробнее