Сортировка записей по произвольным полям в консоли управления WordPress

Опубликовано 8 лет назад

В прошлый раз мы говорили о том как немного упростить жизнь контент-менеджера с помощью фильтрации по таксономиям списка записей WordPress. Сегодня мы пойдём дальше, добавим в список записей колонку со значениями из произвольных полей (custom fields) и сделаем по этим данным сортировку записей.

Сразу поясню, речь идёт о консоли управления WordPress. Мы будем делать сортировку записей в листинге записей для администраторов и контент-менеджеров.

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

Формулируем задачу.

Имеется тип данных (CPT) — portfolio с несколькими записями, каждая из которых содержит произвольное поле price с числовым значением. Необходимо в листинге записей вывести колонку с ценами с возможностью сортировки по-возрастанию и убыванию относительно значений price. Говоря проще, контент-менеджер должен иметь возможность сортировки записей от дешёвых к дорогим и наоборот.

Сортировка записей по произвольным полям в консоли управления WordPress

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

Подробнее
Добавить комментарий