Ich antworte mir selbst, weil ich mir heute die beiden Fragen gestellt habe und einige Zeit damit verbracht habe, eine Antwort zu finden. Sobald ich eine Lösung gefunden habe, möchte ich sie teilen, aber jede andere Lösung wird sehr geschätzt und ich bin bereit, jede Lösung zu akzeptieren, die ich besser als meine gefunden habe. Änderungen und Verbesserungen an meiner Lösung sind ebenfalls erwünscht.
Bearbeiten
Nach der Antwort von Rarst habe ich den Code bearbeitet. Die Funktion verwendet jetzt Standard-Dashicons-Klassen, ermöglicht jedoch auch die Angabe einer alten Bild-URL im menu_icon
Argument und einer brandneuen Dashicons-Klasse im menu_dashicon
Argument.
Arbeitsablauf
Zuerst dachte ich mir, dass register_post_type
eine Aktion registered_post_type
ausgelöst wird, die die übergebenen Argumente an Hook-Funktionen übergibt register_post_type
, ohne sie zu filtern. Auf diese Weise können benutzerdefinierte Argumente für diese Funktionen erstellt werden.
Also habe ich beschlossen, das Argument 'menu_dashicon'
zu übergeben, um ein benutzerdefiniertes Dashicon zu übergeben.
Danach überlegte ich, eine Klasse zu erstellen, die auf dieses Argument hört und das Symbol in einer Klassenvariablen speichert. Die gleiche Klasse kann dafür verantwortlich sein
- Überprüfen Sie die aktuelle Version von WP, und wenn es weniger als 3.8 ist, tun Sie nichts
- Wenn die Version 3.8+ ist, schleifen Sie das
$menu
Array auf den richtigen Hook und:
- Entfernen Sie, falls vorhanden, benutzerdefinierte Bilder, die über
'menu_icon'
und hinzugefügt wurden
'menu_dashicon'
Fügen Sie den Inline-Stil entsprechend dem hinzu, was über den Parameter hinzugefügt wird
Ich erstelle den Code in einer einzigen Datei, auf diese Weise kann er einfach in ein beliebiges Theme / Plugin eingefügt oder sogar als MU-Plugin verwendet werden. Danach kann man einfach das brandneue 'menu_dashicon'
Argument in jedem installierten Theme und / oder Plugin verwenden.
Ich habe auch einen minimalen Plugin-Header hinzugefügt, mit dem es als eigenständiges Plugin verwendet werden kann, aber wahrscheinlich ist dies die weniger nützliche Methode.
Wie benutzt man
Innerhalb übergeben Sie register_post_type
einfach das 'menu_dashicon'
Argument mit dem Wert der Dashicon-Klasse ( ohne Präfix '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);
Das ist alles. Ruft den Klassennamen des Dashicons-Symbols von seiner Site ab .
Also hier der 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);
Es ist auch als Gist erhältlich
Zwei CPTs: "Ideen" und "Galerie" mit Dashicons. Beachten Sie den automatischen Farbwechsel mit verschiedenen Admin-Farbschemata.
menu_icon
, können Sie die Bild-URL für frühere Versionen nicht verwenden ... aber wen interessiert das? :)