我可以将类别Metabox添加到附件吗?

时间:2010-08-18 作者:Rick Curran

我在用register_taxonomy_for_object_type() 将类别分类字段添加到媒体上载(附件)。我正在使用此代码执行此操作:

add_action(\'init\', \'reg_tax\');
function reg_tax() {
   register_taxonomy_for_object_type(\'category\', \'attachment\');
}
这可以在查看图像时为媒体页面添加一个简单的分类文本字段。我真正想要的是让它显示实际的Categories Metabox,这样我就可以选择我想要使用的类别,而不仅仅是在普通字段中键入它们。我还发现,将一个类别的slug放在这个文本字段中,比如my-category-name 最终显示为实际类别名称,如My Category Name 保存时,这使得简单文本字段更不实用。

我一直在看add_post_type_support() 用于添加元盒的函数,并且已经看到它用于自定义帖子类型,我只是不知道是否可以为附件添加相同的元盒。

4 个回复
最合适的回答,由SO网友:Rick Curran 整理而成

Edit: 12/09/2017 See this answer for a more up to date solution to this: How to use taxonomies on attachments with the new Media Library?

我将在这里回答我自己的问题,因为我已经设法找到了一个解决我一直试图做的事情的方法。我得出的结论是,不可能为附件启用类别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\');
}
添加的字段显示如下:

alt text

这只是一个纯文本字段,但我发现您可以在其中键入现有类别的名称,然后在更新附件时将其成功保存(唯一奇怪的行为是,它在保存后返回正常版本,而不是slug)。

当我意识到我可以用这种方式保存类别时,我想我可以将所有可用类别的列表作为复选框,并选中已选中的类别。然后,我使用了一点jQuery来获取选中类别的值,并将所有类别的slug放入类别字段。为了使这看起来更加无缝,我使用了一点简单的CSS来隐藏包含Category字段的表行,因此您所看到的只是复选框,如下所示:

alt text

现在,我可以将类别添加到图像附件中,我可以使用以下内容:

get_posts(\'post_type=attachment&category_name=timber-fixed-windows\')
并将分类后的图像拉入页面!这正是我希望做的,我不认为有什么办法可以做到,但很高兴我找到了办法。

我已经将其转换为一个名为WOS Media Categories 我可以从my website, Suburbia.org.uk, 我希望它对其他人有用!再次感谢那些对我在这里提出的问题和其他问题发表评论的人,他们帮助我解决了这个问题!

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

SO网友:Drew Gourley

刚刚创建了这个,这是一个完整的解决方案,可以将herky jerk javascript链接到表单字段。由于复选框的值在提交时与$\\u POST一起传递,因此您可以在add\\u image\\u attachment\\u fields\\u to\\u save filter期间获取它们,并设置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数组以匹配设置复选框时使用的相同数组)

沙巴姆,沙博兹。享受

SO网友:John P Bloch

如果您想使用WordPress的默认类别框,这很困难/复杂。首先,metabox不返回输出,它只是回显输出。最重要的是,它不会给出正确的输入字段名,因此无法保存。一个想法可能是使用jQuery UI Autocomplete 复制标记框的功能。

但是,如果您想使用媒体编辑器的字段,可以\'attachment_fields_to_edit\' 并编辑字段数组。过滤器向回调传递两个参数:第一个参数是字段数组,第二个是附件post对象。有关更多详细信息,请参见此处:

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

SO网友:eddiemoya

我以@RickCurran的WOS媒体分类为起点创建了一个插件。然而,WOS Media Categories和其他为Media添加类别支持的插件一样,实际上并没有添加metabox,我只是这样做了。

overall view

它必然简化了帖子和页面上的元数据库,但我确实包含了一个过滤功能,使其易于使用。

filterable categories

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

我欢迎任何人对如何使metabox充分发挥功能有任何想法,我打算在以后的版本中这样做。

结束

相关推荐