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


18

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


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

@Mike: Спасибо, мне интересно посмотреть, какие есть решения для этой проблемы. Кажется, что то, что мне нужно, составляет около 90% в WordPress в том виде, в каком оно есть, это еще неизвестно о последних 10%!
Рик Керран

Я сделал нечто очень похожее с пользовательским метабоксом поста; т. е. встраивание (основного) списка категорий (т. е. без вкладок для всех / наиболее популярных). Это зависит только от того, как 'attachment_fields_to_edit' реализует свой POST. Во всяком случае, я не могу сделать сегодня вечером. Нужно поспать.
MikeSchinkel

Ой, как вы уже ответили, я сниму свой список дел.
MikeSchinkel

@ Майк: Спасибо за вашу помощь, я хотел бы получить отзыв о моем решении. Я рад, что нашел способ заставить это работать. Было бы замечательно видеть добавление категорий к вложениям через метабокс фактической категории, но мое решение работает достаточно хорошо.
Рик Курран

Ответы:


14

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

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

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

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

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

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

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

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

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

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

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


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

1
@Mike: Да, я тоже немного обеспокоен этим. Тем не менее, во многих случаях задействован JavaScript, поэтому я решил, что достаточно доволен этим решением. Определенно рад получить обратную связь об альтернативных методах, хотя. Когда я получу шанс, я хотел бы отправить это в репозиторий WordPress, хотя я могу подождать и посмотреть, с чем вы вернетесь. Благодарность!
Рик Курран

@Mike или @Rick - Не могли бы вы привести еще один пример, который может автоматически назначать пост определенной категории при добавлении медиа? Ассоциация категории будет основана на типе сообщения, на котором он находится, или будет установлен вручную с помощью кода?
NetConstructor.com

@ NetConstructor.com - Похоже, еще один вопрос для меня ...
MikeSchinkel

@ netconstructor.com: Да, звучит как еще один большой вопрос для меня!
Рик Курран

4

только что создал это, что является полным обходным путем к связи 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);

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

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


Ваша функция add_image_attachment_fields_to_save должна вернуть $ post в конце. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;, И скрипт, который вы разместили, не выполняет register_custom_taxonomies. Но в любом случае хороший сценарий. Обязательно буду использовать это в будущем!
Роб Вермеер

Ой, я сложила все вместе, думая, что мне удобно. Я исправлю это здесь через секунду. Хороший момент по возвращении, хотя, у меня не было никаких проблем с этим.
Дрю Гурли

1

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

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

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


Спасибо, я посмотрю attachment_fields_to_editи посмотрю, как все пойдет.
Рик Керран

1

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

Общий вид

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

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

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

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


0

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

Если вы переместите встроенный триггер 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; 

}


Спасибо djbokka! Я добавил это исправление в кодовую базу и обновил файлы плагинов, которые можно загрузить с моего сайта по адресу suburbia.org.uk/page/projects.html#wos_media_categories
Рик Курран,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.