it-swarm.cn

我可以在附件中添加Category Metabox吗?

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

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

这适用于查看图像时为“媒体”页面添加“类别”的简单文本字段。我真正想要的是让它显示实际的类别Metabox,这样我就可以选择我想要使用的类别,而不仅仅是将它们输入到普通字段中。我还发现将一个类别的slug放入这个文本字段(例如my-category-name)最终会在保存时显示为My Category Name之类的实际类别名称,这使得简单文本字段更不是一个有用的选项。

我一直在寻找添加Metaboxes的add_post_type_support()函数,并且看到它用于自定义帖子类型,我只是看不出是否可以为附件添加相同内容。

18
Rick Curran

编辑:12/09/2017查看此答案以获取更新的解决方案: 如何在新媒体库的附件上使用分类法?

我将在这里回答我自己的问题,因为我已经设法找到了我一直想做的解决方案。我得出的结论是,无法为附件启用Category 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

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

一旦我意识到我可以通过这种方式保存类别,那么我认为我可以获得所有可用类别的列表作为复选框并检查已选择的类别。然后我使用了一些jQuery来获取已检查类别的值,并将所有类别的slugs放入Category字段中。为了使这看起来更加无缝,我使用了一小段CSS来隐藏包含Category字段的表行,所以你看到的只是复选框,如下所示:

alt text

既然我可以为图像附件添加类别,我可以使用以下内容:

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

并将分类的图像拉成一个页面!正是我希望做的事情,我认为没有办法做到这一点,但很高兴我设法解决了一些问题。

我把它变成了一个名为WOS Media Categories的插件,我可以从 我的网站Suburbia.org.uk下载 ,我希望它可能对其他人有用!再次感谢那些评论过这个以及我在这里问过的其他问题的人,这些问题帮助解决了这个问题!

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

13
Rick Curran

刚刚创建了这个,这是对表单字段的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。请享用。

4
Drew Gourley

我使用@ RickCurran的WOS Media Categories作为起点创建了一个插件。但是,WOS Media Categories和其他为媒体添加类别支持的插件一样,实际上并没有添加元数据库,我就是这样做的。

overall view

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

filterable categories

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

我欢迎任何人可能有任何想法如何使metabox完全正常运行 - 我打算在以后的版本中做。

1
eddiemoya

如果您想使用WordPress的默认类别框,这很难/很复杂。首先,元数据不返回输出,它只是回应它。最重要的是,它不会给你正确的输入字段名称,因此它不会保存。一个想法可能是使用 jQuery UI自动完成 来复制标签框的功能。

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

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

1
John P Bloch

伟大的插件瑞克 - 非常有帮助。

如果您将onclick触发器内联移动而不是将其绑定到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; 

}

0
djbokka