В стандартной админке WordPress фильтрация записей по автору и категории обычно осуществляется отдельно, и пользователь не всегда может применить комбинированные фильтры для более точного поиска. В этой статье мы подробно разберем, как изменить фильтр записей в админке WordPress так, чтобы можно было одновременно отбирать записи по автору и категории. Это полезно для сайтов с большим количеством контента и несколькими авторами.
Почему стоит изменить стандартный фильтр записей в WordPress
По умолчанию WordPress позволяет фильтровать записи по автору, категории, дате и другим параметрам, но комбинировать эти фильтры в админке не всегда удобно. Например, вы хотите увидеть все записи, написанные конкретным автором в конкретной категории — для этого придется либо вручную искать, либо использовать внешние плагины.
Изменив фильтрацию через добавление кастомного кода, вы сделаете интерфейс удобнее и повысите производительность работы редакторов и администраторов.
Кроме того, это можно использовать для создания более гибких отчетов и аналитики по контенту.
Добавляем комбинированный фильтр по автору и категории в админке WordPress
Добавление выпадающих списков в верхнюю панель фильтров
Для начала нам нужно добавить элементы управления в админку, чтобы пользователь мог выбрать автора и категорию одновременно.
Для этого используем хук restrict_manage_posts. Ниже пример кода, который добавит два выпадающих списка — для авторов и категорий — в экран списка записей:
function wpbloger_restrict_manage_posts() {
global $typenow;
if ( $typenow != 'post' ) return;
// Список авторов
$authors = get_users(array('who' => 'authors'));
echo '<select name="author" id="author" class="postform">';
echo '<option value="">Все авторы</option>';
foreach ( $authors as $author ) {
$selected = ( isset($_GET['author']) && $_GET['author'] == $author->ID ) ? 'selected' : '';
echo '<option value="' . esc_attr($author->ID) . '" ' . $selected . '>' . esc_html($author->display_name) . '</option>';
}
echo '</select>';
// Список категорий
$categories = get_categories(array('hide_empty' => false));
echo '<select name="cat" id="cat" class="postform">';
echo '<option value="">Все категории</option>';
foreach ( $categories as $cat ) {
$selected = ( isset($_GET['cat']) && $_GET['cat'] == $cat->term_id ) ? 'selected' : '';
echo '<option value="' . esc_attr($cat->term_id) . '" ' . $selected . '>' . esc_html($cat->name) . '</option>';
}
echo '</select>';
}
add_action('restrict_manage_posts', 'wpbloger_restrict_manage_posts');
Этот код выведет два селекта в верхней части таблицы с записями. Пользователь сможет выбрать одновременно автора и категорию.
Обработка фильтрации: изменение запроса к базе данных
Добавленные селекты создадут GET-параметры author и cat. Чтобы WordPress корректно применил их для фильтрации, нужно изменить основной запрос с помощью хука pre_get_posts.
Вот пример функции, которая применит фильтры:
function wpbloger_filter_posts_by_author_and_category($query) {
global $pagenow;
if ( is_admin() && $pagenow == 'edit.php' && $query->is_main_query() ) {
if ( isset($_GET['author']) && $_GET['author'] !== '' ) {
$query->set('author', intval($_GET['author']));
}
if ( isset($_GET['cat']) && $_GET['cat'] !== '' ) {
$query->set('cat', intval($_GET['cat']));
}
}
}
add_action('pre_get_posts', 'wpbloger_filter_posts_by_author_and_category');
Эта функция проверяет, что мы на странице списка записей в админке, и если заданы параметры author и/или cat, применяет их для фильтрации.
Расширение фильтра: добавляем фильтрацию по нескольким категориям или таксономиям
Иногда нужно фильтровать не по одной, а по нескольким категориям, либо добавить другие таксономии, например, теги или кастомные таксономии.
Для этого можно заменить параметр cat на использование tax_query. Ниже пример, как добавить фильтрацию по нескольким терминам таксономии:
function wpbloger_filter_posts_by_taxonomies($query) {
global $pagenow;
if( is_admin() && $pagenow == 'edit.php' && $query->is_main_query() ) {
$tax_query = array();
if ( isset($_GET['cat']) && $_GET['cat'] !== '' ) {
$tax_query[] = array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => intval($_GET['cat']),
);
}
if ( isset($_GET['post_tag']) && $_GET['post_tag'] !== '' ) {
$tax_query[] = array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['post_tag']),
);
}
if ( ! empty($tax_query) ) {
if ( count($tax_query) > 1 ) {
$tax_query['relation'] = 'AND';
}
$query->set('tax_query', $tax_query);
}
if ( isset($_GET['author']) && $_GET['author'] !== '' ) {
$query->set('author', intval($_GET['author']));
}
}
}
remove_action('pre_get_posts', 'wpbloger_filter_posts_by_author_and_category');
add_action('pre_get_posts', 'wpbloger_filter_posts_by_taxonomies');
Чтобы добавить в админку соответствующие селекты, нужно расширить функцию wpbloger_restrict_manage_posts, добавив селект для тегов или других таксономий.
Рекомендации по использованию и совместимость с плагинами
Если на вашем сайте установлен плагин Clearfy Pro от WPSHOP, он уже содержит множество оптимизаций для админки, включая расширенные фильтры. Тем не менее, описанный выше код даст вам полный контроль и гибкость для кастомных сценариев.
Также полезно проверить совместимость с плагинами, которые изменяют интерфейс админки, такими как Admin Columns или WPAdminify, чтобы избежать конфликтов.
Итоги и лучшие практики
- Используйте хук
restrict_manage_postsдля добавления кастомных фильтров в админку. - Обрабатывайте параметры фильтрации через
pre_get_postsдля изменения запроса. - Для сложной фильтрации по таксономиям используйте
tax_queryс правильной структурой. - Тестируйте на тестовом сайте, чтобы не нарушить работу других плагинов и настроек.
- При необходимости интегрируйте с плагинами от WPSHOP для расширенных возможностей.
Таким образом, вы сможете сделать фильтрацию записей в админке WordPress более удобной и функциональной, что существенно ускорит работу с большим количеством контента на сайте.