Sto rispondendo a me stesso perché oggi mi sono posto le 2 domande che ho postato e ho trascorso un po 'di tempo a trovare una risposta. Una volta trovata una soluzione, voglio condividerla, ma qualsiasi altra soluzione è fortemente adattata e sono pronta ad accettare qualsiasi soluzione che ho trovato migliore della mia. Modifiche e miglioramenti alla mia soluzione sono apprezzati e non incoraggiati.
modificare
Dopo la prima risposta ho modificato il codice. Ora la funzione usa le classi di trattini standard, ma consente anche di specificare un URL di immagine vecchio stile menu_icon
nell'argomento e una nuova classe di trattini menu_dashicon
nell'argomento.
Flusso di lavoro
La prima cosa che ho pensato è che register_post_type
, innesca un'azione, registered_post_type
che passa alle funzioni di aggancio a cui sono passati gli argomenti register_post_type
, senza filtrarli, quindi è possibile creare argomenti personalizzati per tali funzioni.
Così ho deciso di passare l'argomento 'menu_dashicon'
per passare un cruscotto personalizzato.
Successivamente ho pensato di creare una classe che ascolta quell'argomento, salvando l'icona in una variabile di classe. La stessa classe può essere responsabile
- controlla la versione corrente di WP, e se è inferiore a 3.8 non fare nulla
- se la versione è la 3.8+ esegui il loop
$menu
dell'array sull'hook corretto e:
- rimuovere, se presenti, eventuali immagini personalizzate aggiunte tramite
'menu_icon'
e
- aggiungere lo stile in linea in base a ciò che viene aggiunto tramite il
'menu_dashicon'
parametro
Creo il codice in un singolo file, in questo modo può essere facilmente incluso in qualsiasi tema / plug-in o persino usato come plug-in MU e successivamente si può semplicemente usare il nuovissimo 'menu_dashicon'
argomento in ogni tema e / o plug-in installato.
Ho anche aggiunto un'intestazione minima del plug-in che consente di utilizzarlo come plug-in autonomo, ma probabilmente è il modo meno utile di utilizzarlo.
Come usare
All'interno register_post_type
basta passare l' 'menu_dashicon'
argomento con il valore della classe dashicon ( senza prefisso '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);
È tutto. Ottieni il nome della classe dell'icona di Dashicons dal suo sito .
Quindi qui il codice:
<?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);
È disponibile anche come Gist
Due CPT: "Idee" e "Galleria" usando Dashicons. Nota cambio automatico del colore con diverse combinazioni di colori dell'amministratore.
menu_icon
non puoi usare l'URL dell'immagine per le versioni precedenti ... ma chi se ne frega del passato? :)