如何在新的媒体库中使用附件分类?

时间:2012-12-20 作者:bueltge

WordPress 3.5更改了媒体管理,现在媒体库编辑屏幕使用默认的帖子类型UI。分类法对于具有不同用户和附件的WP安装非常有用,为查找附件和/或添加分类提供了更多可能性。

我看到了Can I add a Category Metabox to attachment? 在WPSE上,但与WP 3.5一起使用并不完美,也没有关于附件上自定义类别使用的信息,不仅仅是帖子类别。

简而言之:是否可以将自定义类别/标签添加到附件中,以便在带有WP 3.5的媒体库中使用?

3 个回复
最合适的回答,由SO网友:bueltge 整理而成

要从post类型post(默认设置)添加分类单元,那么很容易通过一个小插件添加分类单元“category”和“tags”,如下所示。

<?php
/**
 * Plugin Name: Attachment Taxonomies
 * Plugin URI:  
 * Text Domain: attachment_taxonomies
 * Domain Path: /languages
 * Description: 
 * Version:     1.0.0
 * Author:      Frank Bültge
 * Author URI:  http://bueltge.de
 * License:     GPLv3
 */


add_action( \'init\', \'fb_attachment_taxonomies\' );
function fb_attachment_taxonomies() {

    $taxonomies = array( \'category\', \'post_tag\' ); // add the 2 tax to ...
    foreach ( $taxonomies as $tax ) {
        register_taxonomy_for_object_type( $tax, \'attachment\' ); // add to post type attachment
    }
}
要在附件上使用自定义分类法,请创建自定义分类法并将其添加到post类型,这一点很重要attachment, 比如follow插件。

<?php
/**
 * Plugin Name: Attachment Taxonomies
 * Plugin URI:  
 * Text Domain: attachment_taxonomies
 * Domain Path: /languages
 * Description: 
 * Version:     1.0.0
 * Author:      Frank Bültge
 * Author URI:  http://bueltge.de
 * License:     GPLv3
 */

if ( function_exists( \'add_filter\' ) )
    add_action( \'plugins_loaded\', array( \'Fb_Attachment_Taxonomies\', \'get_object\' ) );
/**
 * Add Tags and Categories taxonmies to Attachment with WP 3.5
 */
class Fb_Attachment_Taxonomies {

    static private $classobj;

    /**
     * Constructor, init the functions inside WP
     *
     * @since   1.0.0
     * @return  void
     */
    public function __construct() {

        // load translation files
        add_action( \'admin_init\', array( $this, \'localize_plugin\' ) );
        // add taxonmies
        add_action( \'init\', array( $this, \'setup_taxonomies\' ) );
    }

    /**
     * Handler for the action \'init\'. Instantiates this class.
     *
     * @since   1.0.0
     * @access  public
     * @return  $classobj
     */
    public function get_object() {

        if ( NULL === self::$classobj ) {
            self::$classobj = new self;
        }

        return self::$classobj;
    }

    /**
     * Localize plugin function.
     *
     * @uses    load_plugin_textdomain, plugin_basename
     * @since   2.0.0
     * @return  void
     */
    public function localize_plugin() {

        load_plugin_textdomain(
            \'attachment_taxonomies\',
            FALSE,
            dirname( plugin_basename( __FILE__ ) ) . \'/languages/\'
        );
    }

    /**
     * Setup Taxonomies
     * Creates \'attachment_tag\' and \'attachment_category\' taxonomies.
     * Enhance via filter `fb_attachment_taxonomies`
     * 
     * @uses    register_taxonomy, apply_filters
     * @since   1.0.0
     * @return  void
     */
    public function setup_taxonomies() {

        $attachment_taxonomies = array();

        // Tags
        $labels = array(
            \'name\'              => _x( \'Media Tags\', \'taxonomy general name\', \'attachment_taxonomies\' ),
            \'singular_name\'     => _x( \'Media Tag\', \'taxonomy singular name\', \'attachment_taxonomies\' ),
            \'search_items\'      => __( \'Search Media Tags\', \'attachment_taxonomies\' ),
            \'all_items\'         => __( \'All Media Tags\', \'attachment_taxonomies\' ),
            \'parent_item\'       => __( \'Parent Media Tag\', \'attachment_taxonomies\' ),
            \'parent_item_colon\' => __( \'Parent Media Tag:\', \'attachment_taxonomies\' ),
            \'edit_item\'         => __( \'Edit Media Tag\', \'attachment_taxonomies\' ), 
            \'update_item\'       => __( \'Update Media Tag\', \'attachment_taxonomies\' ),
            \'add_new_item\'      => __( \'Add New Media Tag\', \'attachment_taxonomies\' ),
            \'new_item_name\'     => __( \'New Media Tag Name\', \'attachment_taxonomies\' ),
            \'menu_name\'         => __( \'Media Tags\', \'attachment_taxonomies\' ),
        );

        $args = array(
            \'hierarchical\' => FALSE,
            \'labels\'       => $labels,
            \'show_ui\'      => TRUE,
            \'show_admin_column\' => TRUE,
            \'query_var\'    => TRUE,
            \'rewrite\'      => TRUE,
        );

        $attachment_taxonomies[] = array(
            \'taxonomy\'  => \'attachment_tag\',
            \'post_type\' => \'attachment\',
            \'args\'      => $args
        );

        // Categories
        $labels = array(
            \'name\'              => _x( \'Media Categories\', \'taxonomy general name\', \'attachment_taxonomies\' ),
            \'singular_name\'     => _x( \'Media Category\', \'taxonomy singular name\', \'attachment_taxonomies\' ),
            \'search_items\'      => __( \'Search Media Categories\', \'attachment_taxonomies\' ),
            \'all_items\'         => __( \'All Media Categories\', \'attachment_taxonomies\' ),
            \'parent_item\'       => __( \'Parent Media Category\', \'attachment_taxonomies\' ),
            \'parent_item_colon\' => __( \'Parent Media Category:\', \'attachment_taxonomies\' ),
            \'edit_item\'         => __( \'Edit Media Category\', \'attachment_taxonomies\' ), 
            \'update_item\'       => __( \'Update Media Category\', \'attachment_taxonomies\' ),
            \'add_new_item\'      => __( \'Add New Media Category\', \'attachment_taxonomies\' ),
            \'new_item_name\'     => __( \'New Media Category Name\', \'attachment_taxonomies\' ),
            \'menu_name\'         => __( \'Media Categories\', \'attachment_taxonomies\' ),
        );

        $args = array(
            \'hierarchical\' => TRUE,
            \'labels\'       => $labels,
            \'show_ui\'      => TRUE,
            \'query_var\'    => TRUE,
            \'rewrite\'      => TRUE,
        );

        $attachment_taxonomies[] = array(
            \'taxonomy\'  => \'attachment_category\',
            \'post_type\' => \'attachment\',
            \'args\'      => $args
        );

        $attachment_taxonomies = apply_filters( \'fb_attachment_taxonomies\', $attachment_taxonomies );

        foreach ( $attachment_taxonomies as $attachment_taxonomy ) {
            register_taxonomy(
                $attachment_taxonomy[\'taxonomy\'],
                $attachment_taxonomy[\'post_type\'],
                $attachment_taxonomy[\'args\']
            );
        }

    }

} // end class
在下面的屏幕截图上看到结果,也看到区别-就像我的小词对源代码一样简单。但示例屏幕截图中我的个人图像与来源无关;)Screenshot of edit media in default post type ui with WP 3.5

Small hints: 模式框中用于在帖子类型上添加媒体的UI与帖子类型附件上的编辑屏幕几乎没有什么不同。层次分类单元在编辑屏幕中只有一棵树。在模式框中,它是一个输入字段,税用逗号作为分隔符。另请参见this post 来自WP Core博客上的Helen。但也可以在屏幕截图中查看“标签”和“类别”的自定义分类法。

Edit attachment in modal box

SO网友:brasofilo

我会用Adding a Taxonomy Filter to Admin List for a Custom Post Type?

我将Frank的代码与Kaiser\'s answer 在那个岗位上。还额外添加了我的一点,添加了帖子类型,将附件上传到这里,作为一个类别。

它产生以下结果:

filtering media categories

add_action(
    \'plugins_loaded\',
    array ( WPSE76720_Attachment_Taxonomies::get_object(), \'plugin_setup\' )
);

// BUELTGE/KAISER/RUDOLF
class WPSE76720_Attachment_Taxonomies 
{
    protected static $instance = NULL;
    public $post_type;
    public $taxonomies;

    /**
     * Used for regular plugin work.
     *
     * @wp-hook plugins_loaded
     * @return  void
     */
    public function plugin_setup()
    {
        // Taxonomies filter
        add_action( \'load-upload.php\', array( $this, \'setup\' ) );
        // add taxonmies
        add_action( \'init\', array( $this, \'setup_taxonomies\' ) );
        add_action( \'add_attachment\', array( $this, \'auto_tax\' ), 10, 2 );
    }

    /**
     * Constructor, init the functions inside WP
     *
     * @since   1.0.0
     * @return  void
     */
    public function __construct() {}

    /**
     * Handler for the action \'init\'. Instantiates this class.
     *
     * @since   1.0.0
     * @access  public
     * @return  $instance
     */
    public function get_object() 
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Setup Taxonomies
     * Creates \'attachment_tag\' and \'attachment_category\' taxonomies.
     * Enhance via filter `fb_attachment_taxonomies`
     * 
     * @uses    register_taxonomy, apply_filters
     * @since   1.0.0
     * @return  void
     */
    public function setup_taxonomies() 
    {
        $attachment_taxonomies = array();
        // Categories
        $labels = array(
            \'name\'              => __( \'Media Categories\', \'b5f-mc\' ),
            \'singular_name\'     => __( \'Media Category\', \'b5f-mc\' ),
            \'search_items\'      => __( \'Search Media Categories\', \'b5f-mc\' ),
            \'all_items\'         => __( \'All Media Categories\', \'b5f-mc\' ),
            \'parent_item\'       => __( \'Parent Media Category\', \'b5f-mc\' ),
            \'parent_item_colon\' => __( \'Parent Media Category:\', \'b5f-mc\' ),
            \'edit_item\'         => __( \'Edit Media Category\', \'b5f-mc\' ), 
            \'update_item\'       => __( \'Update Media Category\', \'b5f-mc\' ),
            \'add_new_item\'      => __( \'Add New Media Category\', \'b5f-mc\' ),
            \'new_item_name\'     => __( \'New Media Category Name\', \'b5f-mc\' ),
            \'menu_name\'         => __( \'Media Categories\', \'b5f-mc\' ),
        );
        $args = array(
            \'hierarchical\' => TRUE,
            \'labels\'       => $labels,
            \'show_admin_column\' => TRUE,
            \'show_ui\'      => TRUE,
            \'query_var\'    => TRUE,
            \'rewrite\'      => TRUE,
        );
        $attachment_taxonomies[] = array(
            \'taxonomy\'  => \'attachment_category\',
            \'post_type\' => \'attachment\',
            \'args\'      => $args
        );
        $attachment_taxonomies = apply_filters( \'fb_attachment_taxonomies\', $attachment_taxonomies );
        foreach ( $attachment_taxonomies as $attachment_taxonomy ) {
            register_taxonomy(
                $attachment_taxonomy[\'taxonomy\'],
                $attachment_taxonomy[\'post_type\'],
                $attachment_taxonomy[\'args\']
            );
        }
    }

    public function setup()
    {
        add_action( current_filter(), array( $this, \'setup_vars\' ), 20 );
        add_action( \'restrict_manage_posts\', array( $this, \'get_select\' ) );
        add_filter( "manage_taxonomies_for_attachment_columns", array( $this, \'add_columns\' ) );
    }

    public function setup_vars()
    {
        $this->post_type = \'attachment\';
        $this->taxonomies = get_object_taxonomies( $this->post_type );
    }

    public function add_columns( $taxonomies )
    {
        return array_merge(
             $taxonomies
            ,$this->taxonomies
        );
    }

    public function get_select()
    {
        $walker = new WCMF_walker;
        foreach ( $this->taxonomies as $tax )
        {
            wp_dropdown_categories( array(
                 \'taxonomy\'        => $tax
                ,\'hide_if_empty\'   => false
                ,\'show_option_all\' => sprintf(
                     get_taxonomy( $tax )->labels->all_items
                 )
                ,\'hide_empty\'      => false
                ,\'hierarchical\'    => is_taxonomy_hierarchical( $tax )
                ,\'show_count\'      => false
                ,\'orderby\'         => \'name\'
                ,\'selected\'        => \'0\' !== get_query_var( $tax )
                    ? get_query_var( $tax )
                    : false
                ,\'name\'            => $tax
                ,\'id\'              => $tax
                ,\'walker\'          => $walker
            ) );
        }
    }

    /**
     * Add the parent post type as an attachment category
     * 
     * @author Rodolfo Buaiz
     */
    public function auto_tax( $post_id ) 
    {
        $the_p = get_post( $post_id );
        if( $the_p->post_parent > 0 ) 
        {
            $cpt = get_post_type( $the_p->post_parent );
            $term = term_exists( $cpt, \'attachment_category\' );
            if( !$term )
                $term = wp_insert_term( $cpt, \'attachment_category\' );

            wp_set_post_terms( $post_id, $term[\'term_id\'], \'attachment_category\', true );
        }
    }
} // end BUELTGE/KAISER/RUDOLF

// KAISER
class WCMF_walker extends Walker_CategoryDropdown
{
    var $tree_type = \'category\';
    var $db_fields = array(
         \'parent\' => \'parent\'
        ,\'id\'     => \'term_id\'
    );
    public $tax_name;

    /**
     * @see   Walker::start_el()
     * @param  string $output Passed by reference. Used to append additional content.
     * @param  object $term   Taxonomy term data object.
     * @param  int    $depth  Depth of category. Used for padding.
     * @param  array  $args   Uses \'selected\' and \'show_count\' keys, if they exist.
     * @param  int    $id
     * @return void
     */
    function start_el( &$output, $term, $depth, $args, $id = 0 )
    {
        $pad = str_repeat( \'&nbsp;\', $depth * 3 );
        $cat_name = apply_filters( \'list_cats\', $term->name, $term );

        $output .= sprintf(
             \'<option class="level-%s" value="%s" %s>%s%s</option>\'
            ,$depth
            ,$term->slug
            ,selected(
                 $args[\'selected\']
                ,$term->slug
                ,false
             )
            ,"{$pad}{$cat_name}"
            ,$args[\'show_count\']
                ? "&nbsp;&nbsp;({$term->count})"
                : \'\'
        );
    }
}
// end KAISER

SO网友:eddiemoya

我的Media Categories 插件会帮你做到这一点-它甚至会清理媒体模式上的界面,这样你仍然可以得到复选框列表,默认情况下,你只会得到文本字段。

结束

相关推荐

Getting posts by taxonomy

我想根据现有的分类术语从CPT获取一组帖子。我想我应该使用WP的get\\u posts()函数:$结果=获取文章(数组$选项);当我指定我感兴趣的CPT时,此函数工作正常:$results=get\\u posts(数组(\'post\\u type\'=>\'my\\u cpt\\u name\');但后来我用我的UOM自定义post类型尝试了这一点,并尝试使用公制进行筛选,公制是一种称为“UOM\\U system”的分类法:$results=get\\u posts(数组(\'post\\u