Cum să folosești taxonomii pentru atașamente în noua Bibliotecă Media?

20 dec. 2012, 11:52:45
Vizualizări: 17.3K
Voturi: 11

WordPress 3.5 a schimbat gestionarea fișierelor media, iar acum ecranul de editare din Biblioteca Media folosește interfața standard pentru tipurile de postări. Taxonomiile sunt foarte utile pentru instalările WordPress cu utilizatori și atașamente diferite, oferind mai multe posibilități de a găsi atașamentele și/sau de a adăuga clasificări.

Am văzut Pot adăuga o Meta-box de Categorii la atașamente? pe WPSE, dar nu este perfect de folosit cu WP 3.5 și nu are informații despre folosirea categoriilor personalizate pe atașamente, nu doar categoriile postărilor.

Pe scurt: este posibil să adaugi categorii/etichete personalizate la atașamente pentru a le folosi în Biblioteca Media cu WP 3.5?

0
Toate răspunsurile la întrebare 3
4
17

Pentru a adăuga taxonomiile din post type-ul post (cel implicit), atunci este ușor să adaugi taxonomiile 'category' și 'tags' cu un mic plugin precum cel din sursa de mai jos.

<?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' ); // adaugă cele 2 taxonomii la...
    foreach ( $taxonomies as $tax ) {
        register_taxonomy_for_object_type( $tax, 'attachment' ); // adaugă la post type-ul attachment
    }
}

Pentru a utiliza taxonomii personalizate pe atașamente, este important să creezi o taxonomie personalizată și să o adaugi la post type-ul attachment, precum în următorul 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' ) );
/**
 * Adaugă taxonomiile Tags și Categories la Attachment în WP 3.5
 */
class Fb_Attachment_Taxonomies {

    static private $classobj;

    /**
     * Constructor, inițializează funcțiile în WP
     *
     * @since   1.0.0
     * @return  void
     */
    public function __construct() {

        // încarcă fișierele de traducere
        add_action( 'admin_init', array( $this, 'localize_plugin' ) );
        // adaugă taxonomiile
        add_action( 'init', array( $this, 'setup_taxonomies' ) );
    }

    /**
     * Handler pentru acțiunea 'init'. Instanțiază această clasă.
     *
     * @since   1.0.0
     * @access  public
     * @return  $classobj
     */
    public function get_object() {

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

        return self::$classobj;
    }

    /**
     * Funcție de localizare a pluginului.
     *
     * @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/'
        );
    }

    /**
     * Configurează Taxonomiile
     * Creează taxonomiile 'attachment_tag' și 'attachment_category'.
     * Poate fi extins 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( 'Etichete Media', 'taxonomy general name', 'attachment_taxonomies' ),
            'singular_name'     => _x( 'Etichetă Media', 'taxonomy singular name', 'attachment_taxonomies' ),
            'search_items'      => __( 'Caută Etichete Media', 'attachment_taxonomies' ),
            'all_items'         => __( 'Toate Etichetele Media', 'attachment_taxonomies' ),
            'parent_item'       => __( 'Etichetă Media Părinte', 'attachment_taxonomies' ),
            'parent_item_colon' => __( 'Etichetă Media Părinte:', 'attachment_taxonomies' ),
            'edit_item'         => __( 'Editează Eticheta Media', 'attachment_taxonomies' ), 
            'update_item'       => __( 'Actualizează Eticheta Media', 'attachment_taxonomies' ),
            'add_new_item'      => __( 'Adaugă Etichetă Media Nouă', 'attachment_taxonomies' ),
            'new_item_name'     => __( 'Nume Etichetă Media Nouă', 'attachment_taxonomies' ),
            'menu_name'         => __( 'Etichete Media', '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( 'Categorii Media', 'taxonomy general name', 'attachment_taxonomies' ),
            'singular_name'     => _x( 'Categorie Media', 'taxonomy singular name', 'attachment_taxonomies' ),
            'search_items'      => __( 'Caută Categorii Media', 'attachment_taxonomies' ),
            'all_items'         => __( 'Toate Categoriile Media', 'attachment_taxonomies' ),
            'parent_item'       => __( 'Categorie Media Părinte', 'attachment_taxonomies' ),
            'parent_item_colon' => __( 'Categorie Media Părinte:', 'attachment_taxonomies' ),
            'edit_item'         => __( 'Editează Categoria Media', 'attachment_taxonomies' ), 
            'update_item'       => __( 'Actualizează Categoria Media', 'attachment_taxonomies' ),
            'add_new_item'      => __( 'Adaugă Categorie Media Nouă', 'attachment_taxonomies' ),
            'new_item_name'     => __( 'Nume Categorie Media Nouă', 'attachment_taxonomies' ),
            'menu_name'         => __( 'Categorii Media', '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

Vezi rezultatul în captura de ecran de mai jos, precum și diferența - mai ușor decât cuvintele mele despre sursă. Dar imaginea persoanei mele din captura de ecran nu este relevantă pentru sursă ;) Captură de ecran a editării media în interfața implicită a post type-ului cu WP 3.5

Mici indicii: interfața din caseta modală pentru adăugarea de media pe post type este puțin diferită față de ecranul de editare pe post type-ul attachment. Taxonomiile ierarhice au doar o structură arbore în ecranul de editare. În caseta modală este un câmp de introducere, iar taxonomia funcționează cu virgulă ca separator. Vezi și acest post de la Helen pe blogul WP Core. Dar vezi și taxonomiile personalizate pentru 'tags' și 'categories' într-o captură de ecran.

Editare atașament în casetă modală

20 dec. 2012 12:08:38
Comentarii

+1+ Încă un pas în descoperirea Media Library 3.5, marele necunoscut din 2012!

brasofilo brasofilo
20 dec. 2012 12:30:10

O adăugare frumoasă ar fi argumentul 'show_admin_column' => true.

brasofilo brasofilo
28 dec. 2012 23:33:46

Da, ai dreptate. Îmi place acest parametru în WP 3.6; îl folosesc adesea cu o mică clasă de ajutor, dacă folosesc mai multe taxonomii: https://github.com/bueltge/WP-Control-Taxonomy

bueltge bueltge
28 dec. 2012 23:41:42

Frank, nu uita că pentru taxonomiile de atașamente, ar trebui să setezi update_count_callback la _update_generic_term_count. Vezi intrarea actualizată din Codex pentru motiv: http://codex.wordpress.org/Function_Reference/register_taxonomy#Arguments

Tom Auger Tom Auger
22 mai 2013 20:07:35
1

Voi extinde răspunsul lui Frank cu Adăugarea unui Filtru de Taxonomie în Lista de Administrare pentru un Tip Personalizat de Postare?

Căutând ambele lucruri, Categorii de Media și Filtru de Taxonomie, am combinat codul lui Frank cu răspunsul lui Kaiser din acel post. De asemenea, am adăugat un plus personal pentru a adăuga tipul de postare, unde atașamentul a fost încărcat, ca o Categorie.

Rezultatul este acesta:

filtrarea categoriilor de media

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;

    /**
     * Folosit pentru activitatea obișnuită a plugin-ului.
     *
     * @wp-hook plugins_loaded
     * @return  void
     */
    public function plugin_setup()
    {
        // Filtru taxonomii
        add_action( 'load-upload.php', array( $this, 'setup' ) );
        // adaugă taxonomii
        add_action( 'init', array( $this, 'setup_taxonomies' ) );
        add_action( 'add_attachment', array( $this, 'auto_tax' ), 10, 2 );
    }

    /**
     * Constructor, inițializează funcțiile în cadrul WP
     *
     * @since   1.0.0
     * @return  void
     */
    public function __construct() {}

    /**
     * Handler pentru acțiunea 'init'. Instanțiază această clasă.
     *
     * @since   1.0.0
     * @access  public
     * @return  $instance
     */
    public function get_object() 
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Configurare Taxonomii
     * Creează taxonomiile 'attachment_tag' și 'attachment_category'.
     * Îmbunătățire prin filtru `fb_attachment_taxonomies`
     * 
     * @uses    register_taxonomy, apply_filters
     * @since   1.0.0
     * @return  void
     */
    public function setup_taxonomies() 
    {
        $attachment_taxonomies = array();
        // Categorii
        $labels = array(
            'name'              => __( 'Categorii Media', 'b5f-mc' ),
            'singular_name'     => __( 'Categorie Media', 'b5f-mc' ),
            'search_items'      => __( 'Caută Categorii Media', 'b5f-mc' ),
            'all_items'         => __( 'Toate Categoriile Media', 'b5f-mc' ),
            'parent_item'       => __( 'Categorie Media Părinte', 'b5f-mc' ),
            'parent_item_colon' => __( 'Categorie Media Părinte:', 'b5f-mc' ),
            'edit_item'         => __( 'Editează Categorie Media', 'b5f-mc' ), 
            'update_item'       => __( 'Actualizează Categorie Media', 'b5f-mc' ),
            'add_new_item'      => __( 'Adaugă Categorie Media Nouă', 'b5f-mc' ),
            'new_item_name'     => __( 'Nume Categorie Media Nouă', 'b5f-mc' ),
            'menu_name'         => __( 'Categorii Media', '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
            ) );
        }
    }

    /**
     * Adaugă tipul de postare părinte ca o categorie de atașament
     * 
     * @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 );
        }
    }
} // sfârșit 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 Passat prin referință. Folosit pentru a adăuga conținut suplimentar.
     * @param  object $term   Obiect de date al termenului de taxonomie.
     * @param  int    $depth  Adâncimea categoriei. Folosit pentru padding.
     * @param  array  $args   Folosește cheile 'selected' și 'show_count', dacă 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})"
                : ''
        );
    }
}
// sfârșit KAISER
28 sept. 2013 05:49:38
Comentarii

Cred că acum este o idee bună să creezi un depozit Github și putem ajuta la întreținerea soluției. Este mai ușor de utilizat și de creat îmbunătățiri personalizate.

bueltge bueltge
1 oct. 2013 17:45:45
0
-1

Plugin-ul meu Categorii Media va face acest lucru pentru tine - chiar optimizează interfața în fereastra modală Media, astfel încât în continuare vei avea lista de căsuțe de bifat, în mod implicit primești doar câmpuri de text.

10 ian. 2013 01:38:15