Вопрос

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

Это было полезно?

Решение

Изменить: 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');
}

Добавленное поле показано так:

alt text

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

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

alt text

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

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

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

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

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

Другие советы

Только что создал это, что является полным обходным путем для связи с JavaScript с полем форм. Поскольку значения ваших флажков передаются вместе с $ _post при отправке, вы можете просто взять их во время фильтра ADD_IMAGE_ATTACHMANT_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);

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

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

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

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

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

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

overall view

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

filterable categories

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

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

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

Если вы перемещаете встроенный в линии триггера OnClick вместо того, чтобы привязать его к загрузке (и сделать несколько других незначительных настроек), он также будет работать на загрузке 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; 

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top