Я відповідаю собі, бо сьогодні я поставив собі два питання, які я опублікував, і витратив деякий час, щоб знайти відповідь. Після того, як я знайшов рішення, я хочу його поділитися, але будь-яке інше рішення високо оцінено, і я готовий прийняти будь-яке рішення, яке я знайшов кращим, ніж моє. Зміни та вдосконалення мого рішення цінуються, а також заохочуються.
Редагувати
Після відповіді Рарста я відредагував код. Тепер функція використовує стандартні класи дашиконів, але також дозволяє вказати старий URL-адресу зображення в menu_icon
аргументі та абсолютно новий клас дашиконів в menu_dashicon
аргументі.
Робочий процес
Спочатку подумав, що я подумав, це те register_post_type
, що спрацьовує дія, registered_post_type
яка переходить до підключення функцій, переданих аргументам register_post_type
, не фільтруючи їх, тому можна створити спеціальні аргументи для цих функцій.
Тож я вирішив передати аргумент, 'menu_dashicon'
щоб пройти спеціальний дашикон.
Після цього я подумав створити клас, який слухатиме цей аргумент, зберігаючи значок у змінній класу. Той самий клас може відповідати
- перевірте версію WP-файлу, і якщо вона менше, ніж 3.8, не робіть нічого
- якщо версія має 3,8+ циклічного циклу
$menu
масиву на належний гачок і:
- видаліть, якщо є, будь-які власні зображення, додані через
'menu_icon'
та
- додайте стиль вбудовування відповідно до того, що додано через
'menu_dashicon'
парам
Я створюю код в одному файлі, таким чином його можна легко включити в будь-яку тему / плагін або навіть використовувати як модуль MU, а після цього можна просто використовувати абсолютно новий 'menu_dashicon'
аргумент у кожній встановленій темі та / або плагіні.
Я також додав мінімальний заголовок плагіна, який дозволяє використовувати його як окремий плагін, але, ймовірно, це менш корисний спосіб використання.
Як користуватись
Всередині register_post_type
просто передайте 'menu_dashicon'
аргумент зі значенням класу dashicon ( без префіксу '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);
Це все. Отримайте назву класу Dashicons з його сайту .
Так ось код:
<?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);
Він також доступний як Gist
Два CPT: "Ідеї" та "Галерея" за допомогою Dashicons. Зверніть увагу на автоматичну зміну кольору за допомогою різних кольорових схем адміністратора.
menu_icon
ви не можете використовувати URL-адресу зображення для попередніх версій ... але кого це хвилює минуле? :)