问题描述

我正在使用 register_taxonomy_for_object_type()将类别分类字段添加到媒体上传 (附件) 。我正在使用这个代码:

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

这可以在查看图像时向 Media 页面添加类别的简单文本字段。我真正想要的是让它显示实际的类别 Metabox,以便我可以选择我想使用的类别,而不是将它们输入到平原字段。我也发现,把这个类别的插件放到这样的文本字段中,比如 my-category-name,当它被保存时,最终会显示为实际的类别名称,像我的类别名称,这使得简单的文本字段更少是一个有用的选项。

我一直在看 add_post_type_support()功能添加 Metaboxes,并已经看到它用于自定义帖子类型,我只是看不到可以添加相同的附件。

最佳解决方案

我会在这里回答我自己的问题,因为我已经设法找出了我一直在努力做的一个解决方案。我得出的结论是,不可能得到附件的类别 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');
}

添加的字段如下所示:

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

一旦我意识到我可以这样保存类别,那么我想我可以得到所有可用类别的列表作为复选框,并检查已被选择的类别。然后,我使用一些 jQuery 来抓取已检查类别的值,并将所有类别的插件放入 「类别」 字段。为了使这看起来更加无缝,我然后使用一些简单的 CSS 来隐藏包含 「类别」 字段的表行,所以你看到的所有复选框就像这样:

现在我可以添加类别到图像附件我可以使用像:

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

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

我已经把它变成一个名为 WOS Media Categories 的插件,我已经可以从 my website, Suburbia.org.uk 下载,希望它可能对其他人有用!再次感谢那些对这个和其他问题发表了意见的人,这些问题帮助了解了!

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

次佳解决方案

刚刚创建了这个,这是一个完整的解决方法,herky-jerk 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);

(请注意,我使用自定义分类法,而不是类别,因此您必须更改 $ categories 数组以匹配您设置复选框时使用的数组)

沙巴姆,沙巴。请享用。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。