Фильтр wp_dropdown_categories по типу записи

Вопрос или проблема

Я использую 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. Заключение

Это решение позволяет вам отфильтровать категории так, чтобы в интерфейсе медиабиблиотеки отображались только те, которые связаны с вложениями. Это избавит вас от отображения всех категорий, которые используются в постах, и даст возможность работать исключительно с актуальными категориями для медиа.

При дальнейших изменениях или расширениях функционала рекомендуем рассмотреть возможность создания пользовательских таксономий в зависимости от ваших потребностей.

Оцените материал
Добавить комментарий

Капча загружается...