Могу ли я добавить метабокс категории во вложение?
-
16-10-2019 - |
Вопрос
Я использую 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');
}
Добавленное поле показано так:
Это просто простое текстовое поле, но я обнаружил, что вы могли бы напечатать имя существующей категории, и тогда оно будет успешно сохранено, когда вложение было обновлено (единственное странное поведение - это то, что оно вернуло обычную версию вместо слизняк после сохранения).
Как только я понял, что могу сохранить категории таким образом, я решил, что смогу получить список всех доступных категорий в качестве флажков и проверить те, которые были выбраны. Затем я использовал немного jQuery, чтобы получить значения проверенных категорий и поместить все категории в поле категории. Чтобы это казалось еще более плавным, я использовал простой кусочек CSS, чтобы скрыть строку таблицы, в которой содержалось поле категории, поэтому все, что вы когда -либо видели, - это флажки, например, так:
Теперь, когда я могу добавить категории в вложения изображения, я могу использовать что -то вроде:
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, как и другие плагины, которые добавляют поддержку категорий к мультимедиа, на самом деле не добавляет метабокс, я сделал именно это.
Он обязательно упрощен в виде метабоксов в сообщениях и на страницах, но я включил возможность фильтрации, которая упрощает его использование.
На самом деле я создаю метабокс категории целиком, который вы видите на страницах и публикациях, но скрываю фрагменты, которые не работают на медиа-странице как из-за отсутствия стиля, так и из-за отсутствия 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;
}