it-swarm-ru.tech

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

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

18
Rick Curran

Изменить: 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, чтобы получить значения проверенных категорий и поместить все слагаемые категорий в поле Category. Чтобы это выглядело еще более плавно, я затем использовал простой кусочек CSS, чтобы скрыть строку таблицы, которая содержала поле "Категория", поэтому все, что вы когда-либо видите, это флажки, например:

alt text

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

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

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

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

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

13
Rick Curran

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

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

4
Drew Gourley

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

overall view

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

filterable categories

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

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

1
eddiemoya

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

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

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

1
John P Bloch

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

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