Me respondo porque hoy me hice las 2 preguntas que publiqué, y pasé algún tiempo buscando una respuesta. Una vez que encontré una solución, quiero compartirla, pero cualquier otra solución es altamente apreciada y estoy listo para aceptar cualquier solución que encontré mejor que la mía. Las ediciones y mejoras a mi solución son apreciadas y no fomentadas.
Editar
Después de la respuesta de Rarst, edité el código. Ahora la función utiliza clases de dashicons estándar, pero también permite especificar una url de imagen de estilo antiguo en el menu_icon
argumento y una clase de dashicons completamente nueva en el menu_dashicon
argumento.
Flujo de trabajo
Primero creo que pensé que era register_post_type
, dispara una acción registered_post_type
, que pasa a las funciones de enganche a las que pasaron los argumentosregister_post_type
, sin filtrarlas, por lo que es posible crear argumentos personalizados para esas funciones.
Así que decidí pasar el argumento 'menu_dashicon'
para pasar un dashicon personalizado.
Después de eso, pensé crear una clase que escuchara ese argumento, guardando el ícono en una variable de clase. La misma clase puede ser responsable de
- compruebe la versión actual de WP y, si es menor, 3.8 no haga nada
- si la versión es 3.8+ en bucle
$menu
matriz en el gancho adecuado y:
- eliminar, si está presente, cualquier imagen personalizada agregada a través de
'menu_icon'
y
- agregue el estilo en línea de acuerdo con lo que se agrega a través del
'menu_dashicon'
parámetro
Creo el código en un solo archivo, de esta manera puede incluirse fácilmente en cualquier tema / complemento o incluso usarse como complemento MU y después de eso uno puede usar el nuevo'menu_dashicon'
argumento en cada tema y / o complemento instalado.
También he agregado un encabezado de complemento mínimo que permite usarlo como un complemento independiente, pero probablemente esa es la forma menos útil de usar.
Cómo utilizar
En el interior register_post_type
solo pasa el 'menu_dashicon'
argumento con el valor de la clase dashicon ( sin el prefijo '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);
Eso es todo. Obtenga el nombre de la clase de icono Dashicons de su sitio .
Entonces aquí el código:
<?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);
También está disponible como Gist
Dos CPT: "Ideas" y "Galería" con Dashicons. Tenga en cuenta el cambio automático de color con diferentes esquemas de color de administrador.
menu_icon
no puedes usar la URL de la imagen para versiones anteriores ... pero ¿a quién le importa el pasado? :)