Вопрос или проблема
Я использую wp_dropdown_categories, чтобы добавить фильтр категорий в медиатеку. Это работает нормально, за исключением того, что отображаются все категории, которые назначены записям, но я хотел бы, чтобы отображались только категории, назначенные вложениям. Также было бы неплохо, если бы счетчик обновлялся только для вложений. Вот код, который добавляет категории к вложениям, а затем позволяет фильтровать их.
/* Добавить категории к вложениям/медиатеке */
function wptp_add_categories_to_attachments() {
register_taxonomy_for_object_type( 'category', 'attachment' );
}
add_action( 'init' , 'wptp_add_categories_to_attachments' );
/* Добавить фильтр категории к изображениям */
function asap_add_image_category_filter() {
$screen = get_current_screen();
if ( 'upload' == $screen->id ) {
$dropdown_options = array( 'show_option_all' => __( 'Посмотреть все категории', 'asap' ), 'hide_empty' => true, 'hierarchical' => true, 'orderby' => 'name', 'show_count' => true );
wp_dropdown_categories( $dropdown_options );
}
}
add_action( 'restrict_manage_posts', 'asap_add_image_category_filter' );
Если бы был аргумент post_type для wp_dropdown_categories, это было бы идеально. Я знаю, что мог бы создать пользовательскую таксономию, но мне бы хотелось узнать, какова будет решение без необходимости делать это.
«Категория» – это таксономия. То, что вы хотите сделать, – это ограничить количество «терминов».
В зависимости от вашей цели (я думаю, вы хотите показать смешанные вложения и записи в одном огромном списке/интерфейсе?) – вы можете создать новую таксономию
, назвать ее my_attachment_terms
, а затем добавить термины к этой таксономии и должным образом их обозначить, **используя функцию wp_insert_term
** – специально обозначая это как псевдоним существующего термина.
https://codex.wordpress.org/Function_Reference/wp_insert_term
‘alias_of’
(string) (необязательно) По умолчанию отсутствует, но если добавлено, ожидается, что это будет слаг, который термин будет псевдонимом для.
По умолчанию: нет
Я не уверен, какие последствия использования этого в стандартной таксономии category
, поэтому я рекомендовал бы сначала поработать с пользовательскими таксономиями, если у вас нет среды разработки, которую вы можете стереть и сбросить по желанию.
Удачи!
Ответ или решение
Для разработки функции, которая будет фильтровать категории в медиабиблиотеке WordPress исключительно по типу вложения, мы можем использовать представленные стремления и продолжить с предварительно зарегистрированной таксономией "категория". В этом ответе я опишу, как настроить (wp_dropdown_categories) так, чтобы он отображал только категории, связанных с вложениями, с обновленным количеством записей в этих категориях.
1. Регистрация таксономии для вложений
Прежде всего, удостоверимся, что категории действительно зарегистрированы для типов вложений:
/* Добавим категории к вложениям */
function wptp_add_categories_to_attachments() {
register_taxonomy_for_object_type('category', 'attachment');
}
add_action('init', 'wptp_add_categories_to_attachments');
2. Изменение функции фильтрации
Затем, нужно изменить функцию, которая добавляет выпадающий список категорий в интерфейс загрузки изображений. Необходимо убедиться, что мы выбираем только те категории, которые имеют прикрепленные к ним вложения, и обновлять счетчик для вложений.
/* Добавление фильтра категорий для изображений */
function asap_add_image_category_filter() {
$screen = get_current_screen();
if ('upload' == $screen->id) {
// Получаем все категории, которые имеют вложения
$args = array(
'taxonomy' => 'category',
'hide_empty' => true,
'object_type' => array('attachment'), // Ограничение по объекту
);
$terms = get_terms($args);
// Добавляем выпадающий список категорий
$dropdown_options = array(
'show_option_all' => __('Просмотреть все категории', 'asap'),
'hide_empty' => true,
'hierarchical' => true,
'orderby' => 'name',
'show_count' => true,
'name' => 'attachment_category_filter',
);
// Уведомляем о необходимости подсчета вложений для категории
foreach ($terms as $term) {
$dropdown_options['taxonomy'] = $term->taxonomy;
$dropdown_options['id'] = $term->term_id;
$dropdown_options['selected'] = isset($_GET['attachment_category_filter']) ? $_GET['attachment_category_filter'] : '';
}
echo '<select name="attachment_category_filter" id="attachment_category_filter">';
echo '<option>' . esc_html($dropdown_options['show_option_all']) . '</option>';
foreach ($terms as $term) {
echo '<option value="' . esc_attr($term->term_id) . '" ' . selected($dropdown_options['selected'], $term->term_id, false) . '>';
echo esc_html($term->name) . ' (' . esc_html($term->count) . ')</option>';
}
echo '</select>';
}
}
add_action('restrict_manage_posts', 'asap_add_image_category_filter');
3. Пояснение коду
- Проверка типа экрана: Убедитесь, что вы находитесь на экране загрузки, перед добавлением фильтра.
- Параметры
get_terms
: Мы используемget_terms
, чтобы получить категории, которые имеют вложения. Важно использовать аргументobject_type
, чтобы ограничить выбор категорий только для вложений. - Создание выпадающего списка: Генерируем выпадающий список, который включает только те категории, которые были получены ранее, и подсчитываем количество вложений в каждой категории.
4. Заключение
Это решение позволяет вам отфильтровать категории так, чтобы в интерфейсе медиабиблиотеки отображались только те, которые связаны с вложениями. Это избавит вас от отображения всех категорий, которые используются в постах, и даст возможность работать исключительно с актуальными категориями для медиа.
При дальнейших изменениях или расширениях функционала рекомендуем рассмотреть возможность создания пользовательских таксономий в зависимости от ваших потребностей.