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


Я использую 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() для добавления метабоксов и видел, как она используется для пользовательских типов записей, я просто не вижу, можно ли добавить то же самое для вложений.

Author: Rick Curran, 2010-08-18

5 answers

Редактировать: 12.09.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');
}

Добавленное поле выглядело следующим образом:

alt text

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

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

alt text

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

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

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

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

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

 14
Author: Rick Curran, 2017-09-12 08:51:33

Только что создал это, что является полным обходным путем для связи javascript herky-jerk с полем формы. Поскольку значения ваших флажков передаются вместе с $_POST при отправке, вы можете просто захватить их во время фильтра add_image_attachment_fields_to_save и задать условия объекта post.

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, чтобы он соответствовал тому же массиву, который вы используете при настройке флажки)

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

 4
Author: Drew Gourley, 2012-01-12 18:53:16

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

Однако, если вы хотите поиграть с полями редактора мультимедиа, вы можете подключиться к 'attachment_fields_to_edit' и отредактировать массив полей. То фильтр передает два аргумента обратному вызову: первый аргумент - массив полей, второй - объект вложения post. Смотрите здесь для получения более подробной информации:

Http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-администратор/включает в себя/media.php.source.html#l1025

 1
Author: John P Bloch, 2010-08-18 17:07:02

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

overall view

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

filterable categories

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

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

 1
Author: eddiemoya, 2017-03-09 18:04:21

Отличный плагин Rick - очень полезный.

Если вы переместите триггер onclick встроенным вместо привязки его к onload (и сделаете несколько других незначительных настроек), он также будет работать с загрузчиком флэш-памяти. В текущей версии 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
Author: , 2010-10-20 15:23:19