我可以在附件中添加类别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()用于添加Metabox 的功能,并已将其用于自定义帖子类型,但我看不到是否可以为附件添加相同的功能。


如果您在选择最佳答案之前等待一两天,我会为您编写一个插件...(我刚刚有客户截止日期 WordPress聚会,可以在今晚展示WordPress答案...)
MikeSchinkel 2010年

@Mike:谢谢,我很想看看这个问题有什么解决方案。看来我所追求的是WordPress中目前约有90%的内容,最后10%的内容还有待观察!
里克·柯兰

我使用自定义的帖子metabox做过非常相似的事情。即嵌入一个(基本)类别列表(即不包含所有/最受欢迎的标签)。这仅取决于“ attachment_fields_to_edit”如何实现其POST。无论如何,我今晚不能做。需要睡觉。
MikeSchinkel 2010年

糟糕,您已经回答了问题,因此我将删除待办事项清单。
MikeSchinkel

@Mike:感谢您的帮助,我希望收到有关我的解决方案的反馈。我很高兴找到了使之工作的方法。很高兴看到通过实际的类别metabox将类别添加到附件中,但是我的解决方案效果很好。
里克·柯兰

Answers:


14

编辑:2017年12月9日看到此答案的最新解决方案: 如何在新媒体库的附件上使用分类法?

我将在这里回答我自己的问题,因为我已经设法找到了解决方案。我得出的结论是,不可能为附件启用类别Metabox。然而,我发现,这是很容易的获得一个基本的字段添加到附件页面分类利用register_taxonomy_for_object_typeadd_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来隐藏包含Category字段的表行,因此您所看到的只是复选框,如下所示:

替代文字

现在,我可以为图像附件添加类别了,我可以使用类似以下的内容:

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

并将分类的图像拉入页面!正是我希望做的事情,我认为没有办法做到这一点,但很高兴我设法弄清楚了。

我已经将其转换为一个名为的插件WOS Media Categories,可以从我的网站Suburbia.org.uk下载该插件,希望它对其他人有用!再次感谢那些对这个问题和我在这里提出的其他问题发表了评论的人,这有助于弄清楚!

更新:我添加了一个修复程序,可以在使用Flash批量上传器上传图像时添加类别。


我对需要数据完整性的东西使用jQuery感到有些不安。我很确定这一切都可以在服务器上完成。我将尝试尽快查看。
MikeSchinkel 2010年

1
@Mike:是的,我也有点担心。但是,在很多情况下都涉及JavaScript,因此我决定对此解决方案感到满意。绝对乐意获得有关替代方法的一些反馈。当我有机会的时候,我想将其提交到WordPress存储库中,尽管我可能会等着看您返回了什么。谢谢!
里克·柯伦

@Mike或@Rick-您能否提供另一个示例,在添加媒体时可以自动将帖子分配到特定类别?类别关联将基于他所在的职位类型还是通过代码手动设置?
NetConstructor.com 2010年

@ NetConstructor.com-听起来像是我的另一个问题……
MikeSchinkel,2010年

@ netconstructor.com:是的,这对我来说是另一个大问题!
里克·柯兰

4

刚刚创建了此代码,这是将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数组以匹配设置复选框时使用的相同数组)

沙巴姆,sha。请享用。


您的add_image_attachment_fields_to_save函数需要在最后返回$ post。 wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;。并且您发布的脚本不会执行register_custom_taxonomies。但是无论如何还是不错的脚本。将来一定会使用它!
Rob Vermeer 2012年

哦,天哪,我以为我很方便便将它们拼凑在一起。我会在几秒钟内将其修复。不过,回报率不错,我对此没有任何麻烦。
德鲁·古里

1

如果您想使用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看看情况如何。
里克·柯兰

1

我已经使用@RickCurran的WOS媒体类别作为起点创建了一个插件。但是,与其他向媒体添加类别支持的插件一样,WOS Media类别实际上并没有添加一个metabox,我已经做到了。

总体看法

它的形式很简单,就是帖子和页面上的metabox,但是我确实包含了一种过滤功能,使其易于使用。

可过滤的类别

我实际上正在生成您在页面和帖子上看到的整个类别metabox,但是由于缺少样式和缺少javascript,隐藏了在媒体页面上不起作用的位。

我欢迎任何人对如何使metabox充分发挥作用有任何想法-我打算在以后的版本中进行。


0

很棒的插件Rick-非常有用。

如果您将onclick触发器内联移动而不是将其绑定到onload(并进行其他一些小的调整),那么它也将在Flash批量上传器上运行。在当前版本中,Flash会在jQuery load事件之后加载,因此对象尚不存在。

修改后的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年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.