WordPress 3.5 a modifié la gestion des médias et l'écran d'édition de la médiathèque utilise désormais l'interface utilisateur de type publication par défaut. Les taxonomies sont très utiles pour WP installations avec différents utilisateurs et pièces jointes, ce qui offre plus de possibilités pour trouver la pièce jointe et/ou ajouter une classification.
J'ai vu Puis-je ajouter une catégorie Metabox à la pièce jointe? sur WPSE, mais ne convient pas à utiliser avec WP 3.5 et ne dispose pas non plus d'informations sur l'utilisation de catégories personnalisées dans les pièces jointes, pas seulement les catégories de publications.
En bref: est-il possible d’ajouter des catégories/balises personnalisées aux pièces jointes à utiliser dans la médiathèque avec WP 3.5?
Pour ajouter les taxons de post type post, la valeur par défaut, il est facile d'ajouter les taxons 'catégorie' et 'tags' avec un petit plugin situé à la source ci-dessous.
<?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
}
}
Pour utiliser les taxonomies personnalisées sur les pièces jointes, il est important de créer une taxonomie personnalisée et de la publier dans le type attachment
, comme le plugin suivant.
<?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
Voir le résultat sur la capture d'écran suivante, ainsi que la différence - plus facile avec mes petits mots à la source. Mais l'image de ma personne dans l'exemple de capture d'écran n'est pas pertinente pour la source;)
Petites astuces: l'interface utilisateur de la boîte modale pour ajouter un média sur le type de publication est légèrement différente de l'écran d'édition de la pièce jointe. Les taxons hiérarchiques n'ont qu'un arbre dans l'écran d'édition. Dans la boîte modale, c’est un champ de saisie et la taxe fonctionne avec une virgule comme séparateur. Voir aussi cet article de Helen sur le blog WP Core. Mais voir les taxonomies personnalisées pour les "tags" et les "catégories" également dans une capture d'écran.
J'étendrai la réponse de Frank avec Ajout d'un filtre de taxonomie à la liste des administrateurs pour un type de publication personnalisé?
En recherchant les deux choses, les catégories de médias et le filtre de taxonomie, j'ai fusionné le code de Frank avec la réponse de Kaiser dans cet article. Nous avons également ajouté une touche supplémentaire pour ajouter le type d'article, où la pièce jointe a été téléchargée, en tant que catégorie.
Il produit ceci:
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( ' ', $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']
? " ({$term->count})"
: ''
);
}
}
// end KAISER