Чи можна додати до вкладеного файлу Metabox?


18

Я використовую register_taxonomy_for_object_type()для додавання поля Таксономія категорії до завантажень (вкладень) медіа. Я використовую цей код для цього:

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

Це працює і додає просте текстове поле для категорії на сторінку «Медіа» під час перегляду зображення. Мені дуже хочеться, щоб він відображав фактичний Metabox категорій, щоб я міг вибрати категорії, які я хочу використовувати, а не просто вводити їх у звичайне поле. Я також виявив, що введення слугу для категорії в це текстове поле, наприклад, my-category-nameвідображається як власне ім'я категорії, наприклад, My Category Nameколи воно зберігається, що робить просте текстове поле ще менш корисним варіантом.

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


Якщо ви зачекаєте день чи два, перш ніж вибрати найкращу відповідь, я напишу вам плагін ... (У мене щойно були терміни клієнтів та зустріч з WordPress, щоб представити відповіді WordPress сьогодні ввечері ...)
MikeSchinkel

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

Я зробив щось дуже схоже зі спеціальним метабоком публікації; тобто вбудовування списку (основних) категорій (тобто без вкладок для всіх / найпопулярніших). Це просто залежить від того, як 'attachment_fields_to_edit' реалізує свій POST. У всякому разі, я не можу зробити сьогодні вночі. Потрібен сон.
MikeSchinkel

На жаль, як ви вже самі відповіли, я зніму свій список справ.
MikeSchinkel

@Mike: Дякую за вашу допомогу, я хотів би отримати відгуки про своє рішення. Я радий, що знайшов спосіб змусити його працювати. Було б чудово побачити додавання категорій до вкладених файлів через фактичну метабокс категорії, але моє рішення працює досить добре.
Рік Курран

Відповіді:


14

Редагувати: 12.12.2017 Дивіться цю відповідь для більш сучасного рішення цього питання: Як використовувати таксономії в додатках до нової медіатеки?

Я збираюся відповісти на своє власне запитання тут, коли мені вдалося знайти рішення того, що я намагався зробити. Я дійшов висновку, що неможливо включити категорію Metabox для вкладених файлів. Тим НЕ менше, я виявив , що це було досить легко отримати основне поле для додається до сторінці вкладень Категорії шляху використання 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 текст

Це просто звичайне текстове поле, але я виявив, що ви можете ввести ім'я існуючої категорії там, і воно буде успішно збережено, коли додаток оновлено (Єдине дивне поведінка - це повернення нормальної версії замість слимак після збереження).

Як тільки я зрозумів, що таким чином можу зберегти категорії, тоді зрозумів, що я можу отримати список усіх доступних категорій як прапорці та перевірити вибрані. Потім я використав трохи jQuery, щоб схопити значення перевірених категорій і помістити всі каталоги категорій у поле Категорія. Щоб зробити це ще більш безпроблемним, я тоді використовував простий біт CSS, щоб приховати рядок таблиці, що містив поле Категорія, тому все, що ви коли-небудь бачите, - це прапорці, наприклад:

alt текст

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

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 у полі форми. Оскільки значення ваших прапорців передаються разом із $ _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);

(зауважте, що я використовую власну таксономію, а не категорії, тому вам доведеться змінити масив $ категорії, щоб відповідати тому ж масиву, який ви використовуєте під час встановлення прапорців)

Шабам, шабосла. Насолоджуйтесь.


Ваша функція 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

Я створив плагін, використовуючи категорію WOS Media Media @ RickCurran як вихідну точку. Однак категорії WOS Media, як і інші плагіни, які додають підтримку категорій до медіа, насправді не додають метабокс, я робив саме це.

загальний вигляд

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

фільтрувані категорії

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

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


0

Відмінний плагін Рік - дуже корисний.

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