Registre CPT utilizando Dashicons para el icono del menú de administración en WP 3.8

15

WordPress 3.8 introdujo en el núcleo el plugin MP6 que, entre otras cosas, usa una fuente icónica llamada Dashicons para mostrar las fuentes en el tablero.

Ahora, es bien sabido que register_post_type tiene un argumento 'menu_icon'que permite especificar un icono personalizado para la entrada del menú de administración de CPT.

En mis complementos / temas, a menudo uso ese argumento con mis imágenes de íconos personalizados que normalmente son oscuras porque antes del menú de administración 3.8 tenía un fondo claro. Con el fondo del menú oscuro predeterminado en WP 3.8 mis iconos se vuelven casi invisibles.

Aparte de eso, creo que usar los nuevos dashicons para mi CPT será genial.

Después de investigar un poco, sé que puedo usar el CSS de los dashicons, algo así como

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

Sin embargo, usar tanto el 'menu_icon'argumento de css register_post_type como el anterior imprimirá ambos íconos en WP 3.8 y un ícono + un carácter extraño en WP 3.8-, y sin 'menu_icon'argumento de uso , en versiones anteriores se usa el ícono predeterminado.

Yo sé que puedo agregar condicionalmente 'menu_icon'en register_post_typeWP 3.8- versiones y añadir condicionalmente css anterior para WP 3,8+, pero:

  • eso implica agregar algo de código (2 declaraciones condicionales) para cada CPT registrado, por lo que actualizar complementos / temas es un trabajo bastante duro
  • me parece más una solución que una solución elegante

Entonces, las preguntas son:

¿Es posible usar dashicons css para WP 3.8+ y usar una imagen personalizada configurada a través de 'menu_icon'param para versiones anteriores de una manera "más simple" que no implica agregar 2 condicionales por cada CPT registrado?

Y, si es así, ¿es posible hacerlo de alguna manera automática desde register_post_typecualquier código adicional?

gmazzap
fuente

Respuestas:

9

Después de atravesar la madriguera del conejo y regresar, la respuesta es: , el núcleo permite usar fácilmente dashicons al registrar tipos de publicaciones y agregar páginas de menú.

Para usar dashicon necesita pasar su clase CSS dashicons-[name] a menu_icono icon_urlen los lugares correspondientes.

Las clases disponibles se pueden buscar dashicons.cssen la fuente o en el sitio de Dashicons (haga clic en el icono y mire el nombre en la parte superior).

¡Alerta! 3.8 parece haberse lanzado dashicons-piechartcomo ejemplo de la clase en documentos en línea, lo cual es incorrecto y no funcionará. La clase real para ese icono en el lanzamiento es dashicons-chart-pie.

Rarst
fuente
He aceptado esto porque es la forma correcta de hacer la cosa. Mi complemento es el beneficio de ser mejor compatible con versiones anteriores (y puedo solucionar el uso de nombres de clase en lugar de char) porque si pones la clase dashicons menu_iconno puedes usar la URL de la imagen para versiones anteriores ... pero ¿a quién le importa el pasado? :)
gmazzap
4

Fácil: solo lea la parte relevante del register_post_type()phpDocBlock y luego use el argumento correcto para menu_icon: D

  • Usa la clase dashicons . Por ej.dashicon-groups
  • Pase un SVG codificado en base64 usando un URI de datos, que se coloreará para que coincida con el esquema de color. Esto debería comenzar con data:image/svg+xml;base64,.
  • Pase 'none'para dejarlo div.wp-menu-imagevacío, de modo que se pueda agregar un icono a través de CSS.
emperador
fuente
1
* La clase Dashicons es lo que @Rarst dice en su respuesta. * El uso de codificación base64 puede ser útil, pero en mi opinión no es realmente sencillo, además svg-painer.js, la biblioteca core js utilizada para manejar el cambio de color puede llevar mucho tiempo si el icono es más "complejo" que los dashicons estándar. * La tercera opción (icono vacío) es válida no solo para WP 3.8+, sino desde hace mucho tiempo ... y usar css es algo que quiero evitar (según la pregunta). Entonces +1 por poner todas las opciones juntas, pero creo que la respuesta aceptada ya responde a mi pregunta. PD: feliz de ver ese diamante cerca de tu nombre :)
gmazzap
@GM Información interesante sobre el svg-painter.jsarchivo. No lo sabía porque aún no lo he intentado.
kaiser
1
Una vez que traté de usarlo en una imagen svg un poco compleja (era una planta de construcción simple) para crear un efecto de cambio de color en el desplazamiento del mouse. Me di por vencido y usé otro enfoque debido a la latencia.
gmazzap
2
@ GM Gracias por eso. Deberías escribir una publicación de blog sobre eso :) Estaba buscando y la única útil que pude encontrar fue la de Sven .
Kaiser
3

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_iconargumento y una clase de dashicons completamente nueva en el menu_dashiconargumento.


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

  1. compruebe la versión actual de WP y, si es menor, 3.8 no haga nada
  2. si la versión es 3.8+ en bucle $menu matriz en el gancho adecuado y:
  3. eliminar, si está presente, cualquier imagen personalizada agregada a través de 'menu_icon' y
  4. 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_typesolo 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


CPT con dashicons

Dos CPT: "Ideas" y "Galería" con Dashicons. Tenga en cuenta el cambio automático de color con diferentes esquemas de color de administrador.


gmazzap
fuente
0

Simplemente agregué esta línea al código que registra el tipo de publicación personalizada:

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

Aquí está el código completo

ingrese la descripción de la imagen aquí

No es necesario agregar ningún CSS.

Brad Dalton
fuente
Eso es exactamente lo que @Rarst dice en su respuesta ...
gmazzap
Rarst no proporciona la línea de código que necesita agregarse al código que crea el CPT o el fragmento completo al que me he vinculado. Además, no hay necesidad de CSS, por lo que mi solución es más eficiente.
Brad Dalton