Odpowiadam sobie, bo dzisiaj zadałem sobie dwa pytania, które opublikowałem, i poświęciłem trochę czasu na znalezienie odpowiedzi. Po znalezieniu rozwiązania chcę je udostępnić, ale każde inne rozwiązanie jest bardzo doceniane i jestem gotowy zaakceptować każde rozwiązanie, które znalazłem lepsze niż moje. Doceniamy zmiany i ulepszenia mojego rozwiązania, a także zachęcamy.
Edytować
Po odpowiedzi Rarst dokonałem edycji kodu. Teraz funkcja korzysta ze standardowych klas dashicons, ale umożliwia także określenie menu_icon
adresu URL starego stylu w argumencie i zupełnie nowej klasy dashicons w menu_dashicon
argumencie.
Przepływ pracy
Po pierwsze, pomyślałem, że register_post_type
uruchamia akcję, registered_post_type
która przechodzi do funkcji przechwytujących, do których przekazywane są argumenty register_post_type
, bez ich filtrowania, więc możliwe jest tworzenie niestandardowych argumentów dla tych funkcji.
Zdecydowałem więc przekazać argument, 'menu_dashicon'
aby przekazać niestandardowy dashicon.
Potem pomyślałem o stworzeniu klasy, która słucha tego argumentu, zapisując ikonę w zmiennej klasy. Ta sama klasa może być odpowiedzialna przed
- sprawdź aktualną wersję WP, a jeśli jest mniejsza niż 3.8, nic nie rób
- jeśli wersja ma wersję 3.8+, zapętl
$menu
tablicę na odpowiednim haku i:
- usuń, jeśli są, wszelkie niestandardowe obrazy dodane za pomocą
'menu_icon'
i
- dodaj styl wbudowany zgodnie z tym, co zostało dodane za pomocą
'menu_dashicon'
parametru
Tworzę kod w jednym pliku, w ten sposób można go łatwo włączyć do dowolnego motywu / wtyczki lub nawet użyć jako wtyczki MU, a następnie można użyć zupełnie nowego 'menu_dashicon'
argumentu w każdym zainstalowanym motywie i / lub wtyczce.
Dodałem również minimalny nagłówek wtyczki, który pozwala używać go jako samodzielnej wtyczki, ale prawdopodobnie jest to mniej przydatny sposób użycia.
Jak używać
Wewnątrz register_post_type
wystarczy przekazać 'menu_dashicon'
argument z wartością klasy dashicon ( bez przedrostka „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);
To wszystko. Pobierz nazwę klasy ikony Dashicons ze swojej witryny .
Więc tutaj kod:
<?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);
Jest również dostępny jako Gist
Dwa CPT: „Pomysły” i „Galeria” za pomocą Dashicons. Zwróć uwagę na automatyczną zmianę kolorów za pomocą różnych schematów kolorów administratora.
menu_icon
sobie, nie będziesz mógł użyć adresu URL obrazu dla poprzednich wersji ... ale kogo to obchodzi z przeszłością? :)