¿Cómo usar las taxonomías en los archivos adjuntos con la nueva Biblioteca de medios?

9

WordPress 3.5 cambió la administración de medios y ahora la pantalla de edición de la Biblioteca de medios usa la interfaz de usuario predeterminada del tipo de publicación. Las taxonomías son muy útiles para las instalaciones de WP con diferentes usuarios y archivos adjuntos, ya que ofrecen más posibilidades para encontrar el archivo adjunto y / o agregar clasificación.

He visto ¿Puedo agregar una categoría Metabox al archivo adjunto? en WPSE, pero no es perfecto para usar con WP 3.5 y tampoco tiene información sobre el uso de categorías personalizadas en archivos adjuntos, no solo las categorías de publicaciones.

En resumen: ¿es posible agregar etiquetas / categorías personalizadas a los archivos adjuntos para usar en la Biblioteca de medios con WP 3.5?

bueltge
fuente

Respuestas:

15

Para agregar los taxonmies desde el tipo de publicación post, el valor predeterminado, entonces es fácil agregar taxonmies 'categoría' y 'etiquetas' con un pequeño complemento, como la fuente a continuación.

<?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 taxonomías personalizadas en los archivos adjuntos, es importante que cree una taxonomía personalizada y esto para el tipo de publicación attachment, como el complemento siguiente.

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

Vea el resultado en la siguiente captura de pantalla, también la diferencia, más fácil como mis pequeñas palabras a la fuente. Pero la imagen de mi persona en la captura de pantalla de ejemplo no es relevante para la fuente;) Captura de pantalla de edición de medios en el tipo de publicación predeterminado ui con WP 3.5

Pequeñas sugerencias: la interfaz de usuario del cuadro modal para agregar medios en el tipo de publicación es poco diferente de la pantalla de edición en el archivo adjunto de tipo de publicación. Las taxonías jerárquicas solo tienen un árbol en la pantalla de edición. En el cuadro modal es un campo de entrada y el impuesto funciona con una coma como separador. Vea también esta publicación de Helen en el blog de WP Core. Pero vea las taxonomías personalizadas para 'etiquetas' y 'categorías' también en una captura de pantalla.

Editar archivo adjunto en el cuadro modal

bueltge
fuente
1
+1+ ¡Un paso más para descubrir Media Library 3.5, la gran incógnita de 2012!
brasofilo
2
Una buena adición sería el argumento 'show_admin_column' => true.
brasofilo
Sí, tienes derecho. Me gusta este parámetro en WP 3.6; Lo uso a menudo con una pequeña clase auxiliar, si uso taxones de mayn: github.com/bueltge/WP-Control-Taxonomy
bueltge
2
Frank, no hay que olvidar que para las taxonomías de fijación, se debe fijar probablemente update_count_callbacka _update_generic_term_count. Consulte la entrada actualizada del Codex para saber
Tom Auger
2

¿Extenderé la respuesta de Frank al agregar un filtro de taxonomía a la lista de administradores para un tipo de mensaje personalizado?

Buscando ambas cosas, categorías de medios y filtro de taxonomía, fusioné el código de Frank con la respuesta de Kaiser en esa publicación. También agregué un toque extra mío para agregar el tipo de publicación, donde se cargó el archivo adjunto, como una Categoría.

Produce esto:

filtrado de categorías de medios

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
brasofilo
fuente
Creo que ahora es una buena idea que cree un repositorio de Github y que podamos ayudarlo a mantener la solución. Es más fácil usarlo y crear mejoras personalizadas.
bueltge
-1

El complemento Mis categorías de medios lo hará por usted: incluso limpia la interfaz en el modo de medios para que todavía obtenga la lista de casillas de verificación, de forma predeterminada, todo lo que obtiene son campos de texto.

eddiemoya
fuente