Я отвечаю сам, потому что сегодня я задал себе два вопроса, которые я написал, и потратил некоторое время, чтобы найти ответ. Как только я нашел решение, я хочу поделиться им, но любое другое решение высоко ценится, и я готов принять любое решение, которое я нашел лучше, чем мое. Изменения и улучшения моего решения приветствуются, а также приветствуются.
редактировать
После первого ответа я отредактировал код. Теперь функция использует стандартные классы dashicons, но также позволяет указывать URL-адрес изображения старого стиля в menu_icon
аргументе и новый класс dashicons в menu_dashicon
аргументе.
Workflow
Сначала я подумал, что 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);
Это также доступно как Гист
Два CPT: «Идеи» и «Галерея» с использованием Dashicons. Обратите внимание, автоматическое изменение цвета с различными цветовыми схемами администратора.
menu_icon
предыдущими версиями (и я могу исправить использование имен классов вместо char), потому что, если вы добавите класс dashicons, вы не сможете использовать URL-адрес изображения для предыдущих версий ... но кого волнует прошлое? :)