Registrieren Sie CPTs mit Dashicons für das Administratormenüsymbol in WP 3.8

15

WordPress 3.8 führte im Kern das Plugin MP6 ein, das unter anderem eine Ikone namens Dashicons verwendet, um Schriften im Dashboard anzuzeigen.

Nun ist bekannt, dass register_post_type über ein Argument verfügt 'menu_icon', mit dem ein benutzerdefiniertes Symbol für den CPT-Administratormenüeintrag angegeben werden kann.

In meinen Plugins / Themes verwende ich dieses Argument oft mit meinen benutzerdefinierten Symbolbildern, die normalerweise dunkel sind, weil das 3.8-Admin-Menü einen hellen Hintergrund hatte. Mit dem standardmäßigen dunklen Menühintergrund in WP 3.8 werden meine Symbole fast unsichtbar.

Abgesehen davon denke ich, dass es cool sein wird, die neuen Dashicons für mein CPT zu verwenden.

Nach einigen Recherchen weiß ich, dass ich einfach das CSS von Dashicons verwenden kann, so etwas wie

#menu-posts-mycpt div.wp-menu-image:before { content: "\f226"; }

Wenn Sie jedoch sowohl das 'menu_icon'Argument von register_post_type als auch das vorherige CSS verwenden, werden beide Symbole in WP 3.8 und ein Symbol + ein seltsames Zeichen in WP 3.8- gedruckt. Bei 'menu_icon'älteren Versionen wird ohne Argument das Standardsymbol verwendet.

Ich weiß , ich kann bedingt hinzufügen 'menu_icon'in register_post_typefür WP 3.8- Versionen und bedingt vorherigen CSS für WP hinzufügen 3.8+, aber:

  • Das bedeutet, dass für jedes registrierte CPT Code (2 bedingte Anweisungen) hinzugefügt werden muss. Das Aktualisieren von Plugins / Themes ist also eine harte Arbeit
  • Es scheint mir eher ein Workaround als eine elegante Lösung

Fragen sind also:

Ist es möglich, Dashicons CSS für WP 3.8+ zu verwenden und benutzerdefinierte Images zu verwenden, die über 'menu_icon'param für frühere Versionen auf "einfachere" Weise eingerichtet wurden, ohne dass für jedes registrierte CPT 2 Bedingungen hinzugefügt werden müssen?

Und wenn ja, ist das auf irgendeine automatische Weise direkt register_post_typeohne zusätzlichen Code möglich?

gmazzap
quelle

Antworten:

9

Nachdem Sie durch das Kaninchenloch und zurück gegangen sind, lautet die Antwort: Ja , Core ermöglicht die einfache Verwendung von Dashicons bei der Registrierung von Beitragstypen und beim Hinzufügen von Menüseiten.

Um das Dashicon zu verwenden, müssen Sie seine CSS-Klasse dashicons-[name]an menu_iconoder icon_urlan relevanten Stellen übergeben.

Verfügbare Klassen können dashicons.cssin der Quell- oder Dashicons-Site nachgeschlagen werden (klicken Sie auf das Symbol und sehen Sie sich den Namen oben an).

Warnen! 3.8 scheint mit dashicons-piechartals Beispiel für die Klasse in Inline-Dokumenten veröffentlicht worden zu sein, was falsch ist und nicht funktioniert. Tatsächliche Klasse für dieses Symbol in Release ist dashicons-chart-pie.

Rarst
quelle
Ich habe das akzeptiert, weil es der richtige Weg ist, das Ding zu machen. Mein Plugin hat den Vorteil, dass es besser abwärtskompatibel ist (und ich kann festlegen, dass Klassennamen anstelle von char verwendet werden), denn wenn Sie die Klasse dashicons verwenden menu_icon, können Sie die Bild-URL für frühere Versionen nicht verwenden ... aber wen interessiert das? :)
gmazzap
4

Ganz einfach: register_post_type()Lies einfach den relevanten Teil des phpDocBlocks und verwende dann das richtige Argument für menu_icon: D

  • Verwenden Sie die Dashicons- Klasse. Zum Beispieldashicon-groups
  • Übergeben Sie eine base64-codierte SVG-Datei mit einem Daten-URI, der entsprechend dem Farbschema farbig dargestellt wird. Dies sollte mit beginnen data:image/svg+xml;base64,.
  • Pass 'none'verlassen div.wp-menu-imageleer, so kann ein Symbol über CSS hinzugefügt werden.
Kaiser
quelle
1
* Dashicons Klasse ist das, was @Rarst in seiner Antwort sagt. * Die Verwendung von Base64-Codierung kann nützlich sein, ist jedoch nicht ganz einfach. Darüber hinaus svg-painer.jskann die Kernbibliothek js, die für die Farbänderung verwendet wird, sehr zeitaufwändig sein, wenn das Symbol "komplexer" ist als Standard-Dashicons. * Die dritte Option (leeres Symbol) gilt nicht nur für WP 3.8+, sondern seit langer Zeit ... und die Verwendung von CSS ist etwas, das ich vermeiden möchte (laut Frage). Also +1 für das Zusammenstellen aller Optionen, aber ich denke, die akzeptierte Antwort beantwortet meine Frage bereits. PS froh, diesen Diamanten in der Nähe Ihres Namens zu sehen :)
gmazzap
@GM Interessante Infos zur svg-painter.jsDatei. Wusste es nicht, da ich es noch nicht ausprobiert habe.
Kaiser
1
Einmal habe ich versucht, es in einem etwas komplexen SVG-Bild zu verwenden (es war eine einfache Gebäudeanlage), um einen Farbänderungseffekt beim Bewegen der Maus zu erzeugen. Ich habe aufgegeben und einen anderen Ansatz gewählt, weil ich zu spät dran war.
gmazzap
2
@ GM Danke für diesen einen. Du solltest einen Blog-Beitrag darüber schreiben :) Ich habe gesucht und der einzige nützliche, den ich finden konnte, war der von Sven .
Kaiser
3

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_iconArgument und einer brandneuen Dashicons-Klasse im menu_dashiconArgument.


Arbeitsablauf

Zuerst dachte ich mir, dass register_post_typeeine Aktion registered_post_typeausgelö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

  1. Überprüfen Sie die aktuelle Version von WP, und wenn es weniger als 3.8 ist, tun Sie nichts
  2. Wenn die Version 3.8+ ist, schleifen Sie das $menuArray auf den richtigen Hook und:
  3. Entfernen Sie, falls vorhanden, benutzerdefinierte Bilder, die über 'menu_icon'und hinzugefügt wurden
  4. '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_typeeinfach 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


CPTs mit Dashicons

Zwei CPTs: "Ideen" und "Galerie" mit Dashicons. Beachten Sie den automatischen Farbwechsel mit verschiedenen Admin-Farbschemata.


gmazzap
quelle
0

Ich habe einfach diese Zeile zum Code hinzugefügt, der den benutzerdefinierten Beitragstyp registriert:

'menu_icon'    => 'dashicons-admin-users',

Hier ist der vollständige Code

Bildbeschreibung hier eingeben

Es muss kein CSS hinzugefügt werden.

Brad Dalton
quelle
Genau das sagt @Rarst in seiner Antwort ...
gmazzap
Rarst bietet nicht die Codezeile an, die zum Code hinzugefügt werden muss, der das CPT oder das vollständige Snippet erstellt, mit dem ich verlinkt habe. Außerdem wird kein CSS benötigt, sodass meine Lösung effizienter ist.
Brad Dalton