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()
函数,并看到它用于自定义帖子类型,我只是看不到是否可以为附件添加相同的内容。#1 楼
编辑:2017年12月9日有关此问题的最新解决方案,请参阅此答案:如何在新媒体库的附件上使用分类法?
我要回答我在这里提出了自己的问题,因为我设法找到了解决方案。我得出的结论是,不可能为附件启用类别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');
}
添加的字段显示如下:
这只是一个纯文本字段,但我发现您可以在其中键入现有类别的名称,然后在附件已更新(唯一奇怪的行为是保存后会呈现正常版本而不是Slug)。
一旦我意识到我可以用这种方式保存类别,那么我就可以得到一个列出所有可用类别作为复选框,并选中已选中的类别。然后,我使用了一些jQuery来获取已检查类别的值,然后将所有类别的块放入“类别”字段中。为了使它看起来更加无缝,我然后使用了一些CSS来隐藏包含Category字段的表行,因此您所看到的都是复选框,例如:
现在我可以为图像附件添加类别了,我可以使用类似的东西:
get_posts('post_type=attachment&category_name=timber-fixed-windows')
并将分类的图像拉入页面!正是我希望做的,我认为没有办法做到,但很高兴我设法弄清楚了。
我已经将其转换为名为
WOS Media Categories
的插件,可以从我的网站Suburbia.org.uk下载该插件,希望对其他人有用!再次感谢那些对这个问题和我在这里提出的其他问题发表了评论的人,这有助于弄清楚!更新:我添加了一个修复程序,可以在使用Flash批量上传器。
评论
我对需要数据完整性的东西使用jQuery感到有些不安。我很确定这一切都可以在服务器上完成。我会尽快查看。
– MikeSchinkel
10年8月22日在8:31
@Mike:是的,我也有点担心。但是,在很多情况下都涉及JavaScript,因此我决定对此解决方案感到满意。绝对乐意获得有关替代方法的一些反馈。当我有机会的时候,我想将其提交到WordPress存储库中,尽管我可能会等着看您返回了什么。谢谢!
–里克·柯兰(Rick Curran)
2010年8月23日14:26
@Mike或@Rick-您能否提供另一个示例,当添加媒体时,该示例可以自动将帖子分配到特定类别?类别关联将基于他所在的职位类型还是通过代码手动设置?
– NetConstructor.com
2010-10-19 12:38
@ NetConstructor.com-听起来像是我的另一个问题...
– MikeSchinkel
10-10-20在7:22
@ netconstructor.com:是的,这对我来说是另一个大问题!
–里克·柯兰(Rick Curran)
2010-10-27 14:32
#2 楼
刚刚创建了此代码,这是将herky-jerk javascript链接到表单字段的完整解决方法。由于复选框的值与$ _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);
(请注意,我使用的是自定义分类法,而不是类别,因此您必须更改$ categories数组以与设置复选框时使用的数组匹配)。
Shabam,shabozzle 。享受。
评论
您的add_image_attachment_fields_to_save函数需要在最后返回$ post。 wp_set_object_terms($ post ['ID'],$ terms,'image-format');返回$ post;。并且您发布的脚本不会执行register_custom_taxonomies。但是无论如何还是不错的脚本。将来一定会使用它!
– Rob Vermeer
2012年1月12日在16:49
哦,天哪,我以为我很方便便将它们拼凑在一起。我会在几秒钟内修复它。不过,回报率不错,我对此没有任何问题。
–德鲁·古利(Drew Gourley)
2012年1月12日18:50
#3 楼
如果您想使用WordPress的默认类别框,这将非常困难/复杂。一方面,元框不会返回输出,而只是回显输出。最重要的是,它不会为您提供正确的输入字段名称,因此不会保存。一种想法可能是使用jQuery UI自动完成功能来复制标签框的功能。但是,如果您想使用媒体编辑器的字段,则可以插入
'attachment_fields_to_edit'
并编辑字段数组。过滤器将两个参数传递给回调:第一个参数是字段数组,第二个是附件发布对象。请参阅此处以了解更多详细信息:http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-admin/includes/media.php.source.html#l1025
评论
谢谢,我来看看attachment_fields_to_edit,看看它是怎么回事。
–里克·柯兰(Rick Curran)
2010年8月19日在8:37
#4 楼
我已经使用@RickCurran的WOS Media Categories作为起点创建了一个插件。但是,与其他向媒体添加类别支持的插件一样,WOS媒体类别实际上并未添加元框,我已经做到了。它必须简化为帖子和页面上的元框,但是我确实包含了使其易于使用的筛选功能。
我实际上是在页面和帖子上生成整个类别的metabox,但是由于缺少样式和缺少javascript,因此隐藏了在媒体页面上不起作用的部分。
我欢迎任何人对如何使metabox发挥全部功能的想法-我打算在以后的版本中进行此操作。
#5 楼
很棒的插件Rick-非常有用。如果将inclick触发器内联移动而不是将其绑定到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"....
将批量上传器表单ID添加到css文件:
form#media-single-form tr.category,form#file-form tr.category {
display:none;
}
评论
谢谢djbokka!我现在已经将该修复程序添加到了代码库中,并且更新了插件文件,可以从我的网站上下载该文件,网址为campaignia.org.uk/page/projects.html#wos_media_categories
–里克·柯兰(Rick Curran)
2010年11月1日于13:41
评论
如果您在选择最佳答案之前等待一两天,我会为您编写一个插件...(我刚刚有客户截止日期和WordPress聚会,可以在今晚展示WordPress答案...)@Mike:谢谢,我很想看看这个问题有什么解决方案。看来我所追求的是WordPress中目前约有90%的内容,最后10%的内容还有待观察!
我使用自定义的帖子metabox做过非常相似的事情。即嵌入(基本)类别列表(即不包含所有/最受欢迎的标签)。这仅取决于“ attachment_fields_to_edit”如何实现其POST。无论如何,我今晚不能做。需要睡觉。
糟糕,您已经亲自回答了问题,因此我将从待办事项清单中删除。
@Mike:感谢您的帮助,我希望收到有关我的解决方案的一些反馈。我很高兴找到了使之工作的方法。很高兴看到通过实际的类别metabox将类别添加到附件,但是我的解决方案效果很好。