WordPress 3.8 introduit dans le noyau du plug-in MP6 qui utilise entre autres une police iconique appelée Dashicons pour afficher les polices dans le tableau de bord.
Sachez maintenant que register_post_type a un argument 'menu_icon'
qui permet de spécifier une icône personnalisée pour l’entrée de menu de l’administrateur du CPT.
Dans mes plugins/thèmes, j'utilise souvent cet argument avec des images d'icône personnalisées qui sont normalement sombres car, avant le menu d'administration 3.8, son fond était clair. Avec le fond sombre du menu par défaut dans WP 3.8, mes icônes deviennent presque invisibles.
Cela mis à part, je pense que l’utilisation des nouveaux dashicons pour mon CPT sera cool.
Après quelques recherches, je sais que je peux utiliser le CSS de dashicons, quelque chose comme
#menu-posts-mycpt div.wp-menu-image:before { content: "\f226"; }
Cependant, si vous utilisez les deux arguments 'menu_icon'
de register_post_type
et css précédent, les deux icônes de WP 3.8 et une icône + un caractère étrange de WP 3.8-, et sans utilisation 'menu_icon'
argument, sur les anciennes versions, l'icône par défaut est utilisée.
Je sais que je peux conditionnellement ajouter 'menu_icon'
dans register_post_type
pour WP versions 3.8 - et ajouter conditionnellement les css précédentes pour WP 3.8+, mais:
Donc, les questions sont:
Est-il possible d'utiliser dashicons css pour WP 3.8+ et d'utiliser la configuration d'image personnalisée via 'menu_icon'
param pour les versions précédentes d'une manière "plus simple", sans impliquer l'ajout de 2 conditions pour chaque CPT enregistré?
Et, si tel est le cas, est-il possible de le faire de manière automagique directement à partir de register_post_type
sans code supplémentaire?
Après avoir traversé le terrier du lapin, la réponse est - yes , core permet d’utiliser facilement les dashicons lors de l’enregistrement de types de posts et de l’ajout de pages de menus.
Pour utiliser dashicon, vous devez passer sa classe CSS dashicons-[name]
à menu_icon
ou icon_url
aux endroits appropriés.
Les classes disponibles peuvent être recherchées dans dashicons.css
dans le code source ou Site Dashicons (cliquez sur l’icône et regardez le nom en haut).
Alerte! 3.8 semble avoir publié avec dashicons-piechart
comme exemple de la classe dans les documents en ligne, ce qui est faux et ne fonctionnera pas. La classe réelle pour cette icône dans l'édition est dashicons-chart-pie
.
Facile: il suffit de lire la partie pertinente de register_post_type()
phpDocBlock et d'utiliser ensuite le bon argument pour menu_icon
: D
dashicon-groups
data:image/svg+xml;base64,
.'none'
pour laisser div.wp-menu-image
vide, afin de pouvoir ajouter une icône via CSS.Je me réponds car aujourd'hui je me suis posé les 2 questions que j'ai posées et j'ai passé du temps à trouver une réponse. Une fois que j'ai trouvé une solution, je veux la partager, mais toute autre solution est très appréciée et je suis prêt à accepter toute solution que j'ai trouvée meilleure que la mienne. Les modifications et améliorations apportées à ma solution sont également appréciées et encouragées.
Après Rarst answer, j'ai modifié le code. Maintenant, la fonction utilise des classes de dashicons standard, mais aussi permet de spécifier une url d’image de style ancien dans l’argument menu_icon
et une nouvelle classe de dashicons dans l’argument menu_dashicon
.
Je pensais d’abord que register_post_type
, déclenche une action, registered_post_type
, qui transmet aux fonctions de raccordement les arguments passés à register_post_type
, sans les filtrer; il est donc possible de créer des arguments personnalisés pour ces fonctions.
J'ai donc décidé de passer l'argument 'menu_dashicon'
pour transmettre un dashicon personnalisé.
Après cela, j'ai pensé créer une classe qui écoute cet argument, en enregistrant l'icône dans une variable de classe. La même classe peut être responsable de
$menu
avec le hook correct et:'menu_icon'
et'menu_dashicon'
Je crée le code dans un seul fichier, de cette manière, il peut être facilement inclus dans n'importe quel thème/plugin ou même utilisé comme MU plugin et ensuite, il est tout simplement possible d'utiliser le nouvel argument 'menu_dashicon'
dans chaque thème et/ou plugin installé.
J'ai également ajouté un en-tête de plug-in minimal qui permet de l'utiliser en tant que plug-in autonome, mais c'est probablement la façon la moins utile de l'utiliser.
Dans register_post_type
, passez simplement l'argument 'menu_dashicon'
avec la valeur de la classe dashicon ( sans préfixe 'dashicons-'):
$args = array(
...
'menu_dashicon' => 'chart-pie', // dashicons will be used in WP 3.8+
'menu_icon' => $url_of_the_icon // icon images will be used in WP 3.7.1 & previous
);
register_post_type('my_cpt', $args);
C'est tout. Obtenir le nom de la classe d'icônes Dashicons à partir de son site .
Alors voici le code:
<?php
/**
* Plugin Name: GM CPT Icon
*/
namespace GM;
class CptIcon {
public static $cpt;
public $css;
static function registerIcon( $cpt, $icon ) {
self::$cpt[$cpt] = $icon;
}
function init() {
if ( $this->mp6() ) {
\add_action('admin_menu', array($this, 'parseMenu') );
}
}
function mp6() {
return \version_compare( $GLOBALS['wp_version'], '3.8', '>=' );
}
function parseMenu() {
if ( $this->mp6() && ! empty( self::$cpt ) ) {
foreach ( $GLOBALS['menu'] as $i => $item ) {
if $item[1] === 'edit_posts' && (strpos($item[2], 'edit.php?post_type=') === 0)) {
$this->menuItemClass($i, str_replace('edit.php?post_type=', '', $item[2]));
}
}
}
}
function menuItemClass( $i, $type ) {
if ( \in_array($type, \array_keys(self::$cpt), TRUE ) ) {
$GLOBALS['menu'][$i][4] = str_replace('menu-icon-post', '', $GLOBALS['menu'][$i][4]);
$GLOBALS['menu'][$i][6] = 'dashicons-' . self::$cpt[$type];
}
}
}
\add_action('plugins_loaded', function() {
if ( \is_admin() && !( \defined('DOING_AJAX') && \DOING_AJAX ) ) {
$cpticon = new CptIcon;
$cpticon->init();
}
});
\add_action('registered_post_type', function( $post_type, $args ) {
if ( isset($args->menu_dashicon) && ! empty($args->menu_dashicon) ) {
CptIcon::registerIcon($post_type, $args->menu_dashicon);
}
}, 10, 2);
Il est également disponible sous la forme Gist
Deux CPT: "Ideas" et "Gallery" utilisant Dashicons. Notez le changement de couleur automatique avec différents schémas de couleurs admin.
J'ai simplement ajouté cette ligne au code qui enregistre le type de publication personnalisé:
'menu_icon' => 'dashicons-admin-users',
Voici le code complet
Pas besoin d'ajouter de CSS.