rickcurran
  • 0
Учитель

Можно ли добавить метабокс категории во вложение?

  • 0

Я использую register_taxonomy_for_object_type(), чтобы добавить поле таксономии категорий к загрузкам мультимедиа (вложениям). Я использую этот код для этого:

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

Это работает и добавляет простое текстовое поле для категории на страницу мультимедиа при просмотре изображения. Чего я действительно хочу, так это заставить его отображать фактический метабокс категорий, чтобы я мог выбирать категории, которые я хочу использовать, а не просто вводить их в обычное поле. Я также обнаружил, что добавление слага для категории в это текстовое поле, например, в my-category-name конечном итоге отображается как фактическое имя категории, например My Category Name, при его сохранении, что делает простое текстовое поле еще менее полезным вариантом.

Я смотрел на add_post_type_support() функцию добавления метабоксов и видел, как она используется для пользовательских типов сообщений, я просто не вижу, можно ли добавить то же самое для вложений.

Share
  1. Если вы подождете день или два, прежде чем выбрать лучший ответ, я напишу вам плагин… (У меня только что были сроки клиента и встреча WordPress, чтобы представить ответы WordPress сегодня вечером…)

    • 0
  2. Редактировать: 09.12.2017 См. этот ответ для более актуального решения этой проблемы: Как использовать таксономии для вложений с новой медиатекой?

    Я собираюсь ответить на свой вопрос здесь, поскольку мне удалось найти решение того, что я пытался сделать. Я пришел к выводу, что невозможно включить метабокс категорий для вложений. Однако я обнаружил, что достаточно просто добавить базовое поле для категорий на страницу вложений с помощью register_taxonomy_for_object_type и add_post_type_support :

    add_action('admin_init', 'reg_tax');
    function reg_tax() {
       register_taxonomy_for_object_type('category', 'attachment');
       add_post_type_support('attachment', 'category');
    }
    

    Добавленное поле выглядело так:

    альтернативный текст

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

    Как только я понял, что таким образом можно сохранять категории, я решил, что могу получить список всех доступных категорий в виде флажков и проверить те, которые были выбраны. Затем я использовал немного jQuery, чтобы получить значения проверенных категорий и поместить слаги всех категорий в поле «Категория». Чтобы сделать это еще более плавным, я затем использовал простой бит CSS, чтобы скрыть строку таблицы, содержащую поле «Категория», поэтому все, что вы когда-либо видели, это флажки, например:

    альтернативный текст

    Теперь, когда я могу добавлять категории к вложениям изображений, я могу использовать что-то вроде:

    get_posts('post_type=attachment&category_name=timber-fixed-windows')
    

    И вытащите категоризированные изображения на страницу! Именно то, что я надеялся сделать, я не думал, что будет способ сделать это, но рад, что мне удалось кое-что понять.

    Я превратил это в плагин под названием WOS Media Categories, который я сделал доступным для загрузки с моего веб-сайта Suburbia.org.uk, я надеюсь, что он может быть полезен кому-то еще! Еще раз спасибо тем, кто прокомментировал этот и другие вопросы, которые я задавал здесь, которые помогли разобраться!

    Обновление: я добавил исправление, позволяющее добавлять категории во время загрузки изображений с помощью массовой загрузки Flash.

    • 0
  3. только что создал это, что является полным обходным путем для жесткой привязки javascript к полю формы. Поскольку значения ваших флажков передаются вместе с $_POST при отправке, вы можете просто получить их во время фильтра add_image_attachment_fields_to_save и установить условия объекта публикации.

    function register_custom_taxonomies() {
        $labels = array(
            'name' => _x( 'Image Formats', 'taxonomy general name' ),
            'singular_name' => _x( 'Image Format', 'taxonomy singular name' ),
            'search_items' =>  __( 'Search Formats' ),
            'all_items' => __( 'All Formats' ),
            'parent_item' => __( 'Parent Format' ),
            'parent_item_colon' => __( 'Parent Format:' ),
            'edit_item' => __( 'Edit Format' ), 
            'update_item' => __( 'Update Format' ),
            'add_new_item' => __( 'Add New Format' ),
            'new_item_name' => __( 'New Format Name' ),
            'menu_name' => __( 'Image Format' )
        );
        $capabilities = array(
            'manage_terms' => 'nobody',
            'edit_terms' => 'nobody',
            'delete_terms' => 'nobody'
        );
        $args = array(
            'public' => false,
            'hierarchical' => true,
            'labels' => $labels,
            'capabilities' => $capabilities,
            'show_ui' => false,
            'query_var' => 'image-format',
            'rewrite' => false
        );
        register_taxonomy('image-format', array('attachment'), $args);
    }
    add_action( 'init', 'register_custom_taxonomies', 1);
    
    function add_media_categories($fields, $post) {
        $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
        $post_categories = wp_get_object_terms($post->ID, 'image-format', array('fields' => 'ids'));
        $all_cats .= '<ul id="media-categories-list" style="width:500px;">'; 
        foreach ($categories as $category) {
            if (in_array($category->term_id, $post_categories)) {
                $checked = ' checked="checked"';
            } else {
                $checked = '';  
            }
            $option = '<li style="width:240px;float:left;"><input type="checkbox" value="'.$category->category_nicename.'" id="'.$post->ID.'-'.$category->category_nicename.'" name="'.$post->ID.'-'.$category->category_nicename.'"'.$checked.'> ';
            $option .= '<label for="'.$post->ID.'-'.$category->category_nicename.'">'.$category->cat_name.'</label>';
            $option .= '</li>';
            $all_cats .= $option;
        }
        $all_cats .= '</ul>';
    
        $categories = array('all_categories' => array (
                'label' => __('Image Formats'),
                'input' => 'html',
                'html' => $all_cats
        ));
        return array_merge($fields, $categories);
    }
    add_filter('attachment_fields_to_edit', 'add_media_categories', null, 2);
    
    function add_image_attachment_fields_to_save($post, $attachment) {
        $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
        $terms = array();
        foreach($categories as $category) {
            if (isset($_POST[$post['ID'].'-'.$category->category_nicename])) {
                $terms[] = $_POST[$post['ID'].'-'.$category->category_nicename];        
            }
        }
        wp_set_object_terms( $post['ID'], $terms, 'image-format' );
        return $post;
    }
    add_filter('attachment_fields_to_save', 'add_image_attachment_fields_to_save', null , 2);
    

    (обратите внимание, что я использую пользовательскую таксономию, а не категории, поэтому вам придется изменить массив $categories, чтобы он соответствовал тому же массиву, который вы используете при установке флажков)

    Шабам, шабозл. Наслаждаться.

    • 0
  4. Это сложно/сложно, если вы хотите использовать поле категорий WordPress по умолчанию. Во-первых, метабокс не возвращает вывод, он просто повторяет его. Кроме того, он не даст вам правильное имя поля ввода, поэтому он не будет сохранен. Одной из идей может быть использование автозаполнения пользовательского интерфейса jQuery для воспроизведения функциональности поля тегов.

    Однако, если вы хотите поиграть с полями редактора мультимедиа, вы можете подключиться 'attachment_fields_to_edit' и отредактировать массив полей. Фильтр передает обратному вызову два аргумента: первый аргумент — это массив полей, второй — объект поста вложения. Подробнее см. здесь:

    http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-admin/includes/media.php.source.html#l1025

    • 0
  5. Я создал плагин, используя категории WOS Media от @RickCurran в качестве отправной точки. Однако WOS Media Categories, как и другие плагины, добавляющие поддержку категорий к мультимедиа, на самом деле не добавляет метабокс, я сделал именно это.

    полное представление

    Это обязательно упрощенная форма метабоксов на записях и страницах, но я включил возможность фильтрации, которая упрощает использование.

    фильтруемые категории

    На самом деле я создаю весь метабокс категории, который вы видите на страницах и в сообщениях, но скрываю биты, которые не работают на странице мультимедиа из-за отсутствия стиля и отсутствия javascript.

    Я приветствую любые мысли, которые могут возникнуть у кого-либо относительно того, как сделать метабокс полностью функциональным — то, что я собираюсь сделать в более поздней версии.

    • 0
  6. Отличный плагин Рик — очень полезный.

    Если вы переместите триггер onclick в строку, а не привязываете его к onload (и сделаете несколько других незначительных настроек), он будет работать и на массовом загрузчике Flash. В текущей версии Flash загружается после события загрузки jQuery, поэтому объекты еще не существуют.

    пересмотренный js:

     function wos_category_click(cat){
        var container = jQuery(cat).closest("tbody");
        var cat_checked = jQuery(container).find("tr.all_categories input:checked");
        var cat_arr = jQuery(cat_checked).map(function() {
            return jQuery(this).val();
        }).get().join();
        jQuery(container).find("tr.category > td.field > input.text").val(cat_arr);
    }
    

    добавить onclick для ввода в файле php:

    <input type="checkbox" onclick="wos_category_click(this)" class="wos-categories-cb"....
    

    добавить идентификатор формы массовой загрузки в файл css:

    form#media-single-form tr.category,form#file-form tr.category {
    display:none; 
    

    }

    • 0

Оставить ответ

You must login to add an answer.