Фильтрация записей по таксономиям в консоли WordPress

Фильтрация записей по таксономиям в консоли WordPress

11 июля 2016 115

Называть WordPress блогодвижком может только невежда, знания которого ограничены лишь дефолтной темой и дефолтным функционалом платформы. WordPress уже давно (очень давно!) вышел за рамки обычной блоговой CMS, являясь сегодня одной из самых универсальных и многоцелевых платформ, на которой решаются задачи самой разной направленности. Это и блоги, и лендинги, и различные информационные ресурсы, порталы, корпоративные сайты, каталоги, интернет-магазины. И даже форумы, социальные сети и целые сети пользовательских сайтов. Список можно продолжать бесконечно.

Reg.ru: Регистрация доменов
Reg.ru: Регистрация доменов

С помощью кастомных типов данных (Custom Post Types), таксономий и произвольных полей (Custom fields) в WordPress можно создавать любые структуры данных. Это сильно помогает при разработке интернет-магазинов, различных каталогов и других веб-приложений с большим массивом данных, объекты которых имеют большое количество характеристик, связей и т.д. WordPress позволяет с легкостью генерировать и сортировать во фронтенде любые, даже самые сложные выборки объектов.

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

Рассмотрим конкретный случай из практики.

Дано:

Кастомный тип данных «Портфолио», зарегистрированный в WordPress как «portfolio», а также две привязанные к ней таксономии «Категория» (portfolio_category) и «Заказчики» (portfolio_client).

Задача:

Реализовать возможность фильтрации по пользовательским таксономиям в листинге записей типа данных «Портфолио» внутри консоли управления WordPress. Говоря простым языком, контент-менеджеру необходима возможность видеть списки работ, выполненные для того или иного заказчика, а также иметь возможность вывода работ в зависимости от выбранной категории.

Решение:

Сразу замечу, для того чтобы в листинге записей появилась колонка с таксономией, необходимо при её регистрации, задать ‘show_admin_column’ => true.

register_taxonomy( 'portfolio_category', 'portfolio', array( 
	'hierarchical' => true, 
	'label' => 'Категория', 
	'show_admin_column' => true, 
	'query_var' => true, 
	'rewrite' => true 
	) 
);

Тогда листинг записей будет выглядеть таким образом.

Листинг записей с таксономиями WordPress

Что уже заметно упрощает визуальный анализ информации.

Но мы пойдем дальше и сделаем ещё и фильтрацию.

Для этого создадим функцию danilin_add_taxonomy_filters(), которая будет выводить в шапке листинга выпадающие списки с именами элементов таксономии, а при выборе отфильтрует список записей. Функцию традиционно размещаем в файле functions.php активной темы, а еще лучше в функциональном плагине, в котором правильнее хранить весь дополнительный функционал сайта.

// Фильтрация записей по таксономиям

function danilin_add_taxonomy_filters() {
  global $typenow;

  // таксономии
  $taxonomies = array('portfolio_category','portfolio_client');

  // пользовательский тип данных
  if( $typenow == 'portfolio' ){

    foreach ($taxonomies as $tax_slug) {
      $tax_obj = get_taxonomy($tax_slug);
      $tax_name = $tax_obj->labels->name;
      $terms = get_terms($tax_slug);
      if(count($terms) > 0) {
        echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
        echo "<option value=''>$tax_name</option>";
        foreach ($terms as $term) { 
          echo '<option value='. $term->slug, $_GET[$tax_slug] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>'; 
        }
        echo "</select>";
      }
    }
  }
}
add_action( 'restrict_manage_posts', 'danilin_add_taxonomy_filters' );

В коде я отметил места, где задаётся пользовательский тип данных и массив таксономий, для которых будет применяться фильтрация.

Результат работы функции выглядит следующим образом.

Фильтрация записей по таксономиям в консоли WordPress

Как видим, теперь контент-менеджеру будет гораздо проще и комфортнее работать с большими объёмами данных.

Задача решена.

Автор: Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе WordPress.

Комментарии

Разгоните свой WordPress

Хостинг-провайдер номер один в России — REG.RU

Подробнее