Называть WordPress блогодвижком может только невежда, знания которого ограничены лишь дефолтной темой и дефолтным функционалом платформы.
WordPress уже давно (очень давно!) вышел за рамки обычной блоговой CMS, являясь сегодня одной из самых универсальных и многоцелевых платформ, на которой решаются задачи самой разной направленности. Это и блоги, и лендинги, и различные информационные ресурсы, порталы, корпоративные сайты, каталоги, интернет-магазины. И даже форумы, социальные сети и целые сети пользовательских сайтов. Список можно продолжать бесконечно.
С помощью кастомных типов данных (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 ) );
Тогда листинг записей будет выглядеть таким образом.
Что уже заметно упрощает визуальный анализ информации.
Но мы пойдем дальше и сделаем ещё и фильтрацию.
Для этого создадим функцию 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' );
В коде я отметил места, где задаётся пользовательский тип данных и массив таксономий, для которых будет применяться фильтрация.
Результат работы функции выглядит следующим образом.
Как видим, теперь контент-менеджеру будет гораздо проще и комфортнее работать с большими объёмами данных.
Задача решена.
Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.
Подробнее
У вас статья как создать фильтр постов или страниц в админ-панели.
А нехотите написать статью, как то же самое сделать на фронэнде ?