Estou me respondendo porque hoje me perguntei as 2 perguntas que publiquei e passei algum tempo para encontrar uma resposta. Depois de encontrar uma solução, quero compartilhá-la, mas qualquer outra solução é muito apreciada e estou pronta para aceitar qualquer solução que tenha encontrado melhor que a minha. Edições e melhorias na minha solução são apreciadas e não incentivadas.
Editar
Após a resposta Rarst, editei o código. Agora, a função use classes padrão dashicons, mas também permite especificar um URL de imagem no estilo antigo no menu_icon
argumento e uma nova classe dashicons no menu_dashicon
argumento.
Workflow
Primeiro, acho que pensei que register_post_type
, dispara uma ação, registered_post_type
que passa para as funções de ligação dos argumentos transmitidos register_post_type
, sem filtrá-las, para que seja possível criar argumentos personalizados para essas funções.
Então, decidi passar o argumento 'menu_dashicon'
para passar um dashicon personalizado.
Depois disso, pensei em criar uma classe que ouvisse esse argumento, salvando o ícone em uma variável de classe. A mesma classe pode ser responsável por
- verifique a versão atual do WP e, se for menor que 3,8, não faça nada
- se a versão for 3.8+, faça um loop na
$menu
matriz no gancho adequado e:
- remova, se houver, quaisquer imagens personalizadas adicionadas por
'menu_icon'
e
- adicione o estilo embutido de acordo com o que é adicionado através do
'menu_dashicon'
parâmetro
Eu crio o código em um único arquivo, dessa forma ele pode ser facilmente incluído em qualquer tema / plugin ou até mesmo usado como plugin MU e, depois disso, é possível usar o 'menu_dashicon'
argumento novo em todos os temas e / ou plugins instalados.
Também adicionei um cabeçalho mínimo de plug-in que permite usá-lo como um plug-in independente, mas provavelmente essa é a maneira menos útil de usar.
Como usar
Por dentro, register_post_type
basta passar o 'menu_dashicon'
argumento com o valor da classe dashicon ( sem o prefixo '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);
Isso é tudo. Obtenha o nome da classe de ícone dos Dashicons em seu site .
Então aqui o 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);
Também está disponível como Gist
Dois CPTs: "Ideias" e "Galeria" usando Dashicons. Observe a mudança automática de cores com diferentes esquemas de cores de administrador.
menu_icon
não poderá usar o URL da imagem para versões anteriores ... mas quem se importa com o passado? :)