Como usar taxonomias em anexos com a nova Biblioteca de Mídia?

8

O WordPress 3.5 mudou o gerenciamento de mídia e agora a tela de edição da Biblioteca de Mídia usa a interface do usuário do tipo padrão. As taxonomias são muito úteis para instalações do WP com diferentes usuários e anexos, oferecendo mais possibilidades para encontrar o anexo e / ou adicionar classificação.

Eu vi Posso adicionar uma Categoria Metabox ao anexo? no WPSE, mas não é perfeito para usar com WP 3.5 e também não tem informações sobre o uso de categorias personalizadas em anexos, não apenas as categorias de posts.

Resumindo: é possível adicionar categoria / tags personalizadas aos anexos para usar na Biblioteca de Mídia com o WP 3.5?

    
por bueltge 20.12.2012 / 10:52

3 respostas

12

Para adicionar as taxonmias do tipo post de postagem, o padrão, é fácil adicionar taxonmies 'category' e 'tags' com um pequeno plugin na fonte abaixo.

<?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
    }
}

Para usar taxonomias personalizadas em anexos, é importante criar uma taxonomia personalizada e isso para o tipo de postagem attachment , como o seguinte plugin.

<?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

Veja o resultado na captura de tela a seguir, também a diferença - mais fácil como minhas pequenas palavras para a fonte. Mas a imagem da minha pessoa na captura de tela do exemplo não é relevante para a fonte;)

Pequenasdicas:ainterfacedousuáriodacaixamodalparaadicionarmídianotipodepostageméumlancepequenodiferentedateladeediçãonoanexodetipodepostagem.Ostáxonoshierárquicostêmapenasumaárvorenateladeedição.Nacaixamodaléumcampodeentradaeoimpostotrabalhacomvírgulacomoseparador.Vejatambém este post Helen no blog do WP Core. Mas veja as taxonomias personalizadas para "tags" e "categorias" também em uma captura de tela.

    
por bueltge 20.12.2012 / 11:08
2

Eu estenderei a resposta de Frank com Adicionando um filtro de taxonomia à lista de administradores para um tipo de postagem personalizado?

Olhando para as duas coisas, Media Categories e Taxonomy Filter, eu mesclei o código de Frank com resposta da Kaiser nesse post . Também adicionei um toque extra meu para adicionar o tipo de post, onde o anexo foi enviado, como uma Categoria.

Produz isso:

add_action('plugins_loaded',array(WPSE76720_Attachment_Taxonomies::get_object(),'plugin_setup'));//BUELTGE/KAISER/RUDOLFclassWPSE76720_Attachment_Taxonomies{protectedstatic$instance=NULL;public$post_type;public$taxonomies;/***Usedforregularpluginwork.**@wp-hookplugins_loaded*@returnvoid*/publicfunctionplugin_setup(){//Taxonomiesfilteradd_action('load-upload.php',array($this,'setup'));//addtaxonmiesadd_action('init',array($this,'setup_taxonomies'));add_action('add_attachment',array($this,'auto_tax'),10,2);}/***Constructor,initthefunctionsinsideWP**@since1.0.0*@returnvoid*/publicfunction__construct(){}/***Handlerfortheaction'init'.Instantiatesthisclass.**@since1.0.0*@accesspublic*@return$instance*/publicfunctionget_object(){NULL===self::$instanceandself::$instance=newself;returnself::$instance;}/***SetupTaxonomies*Creates'attachment_tag'and'attachment_category'taxonomies.*Enhanceviafilter'fb_attachment_taxonomies'**@usesregister_taxonomy,apply_filters*@since1.0.0*@returnvoid*/publicfunctionsetup_taxonomies(){$attachment_taxonomies=array();//Categories$labels=array('name'=>__('MediaCategories','b5f-mc'),'singular_name'=>__('MediaCategory','b5f-mc'),'search_items'=>__('SearchMediaCategories','b5f-mc'),'all_items'=>__('AllMediaCategories','b5f-mc'),'parent_item'=>__('ParentMediaCategory','b5f-mc'),'parent_item_colon'=>__('ParentMediaCategory:','b5f-mc'),'edit_item'=>__('EditMediaCategory','b5f-mc'),'update_item'=>__('UpdateMediaCategory','b5f-mc'),'add_new_item'=>__('AddNewMediaCategory','b5f-mc'),'new_item_name'=>__('NewMediaCategoryName','b5f-mc'),'menu_name'=>__('MediaCategories','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_taxonomiesas$attachment_taxonomy){register_taxonomy($attachment_taxonomy['taxonomy'],$attachment_taxonomy['post_type'],$attachment_taxonomy['args']);}}publicfunctionsetup(){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
    
por brasofilo 28.09.2013 / 04:49
-1

Meu plugin Media Categories fará isso para você - ele até limpa a interface no Modal de mídia, para que você ainda receba a lista de caixas de seleção, por padrão, tudo o que você tem são campos de texto.

    
por eddiemoya 10.01.2013 / 00:38