Aqui está uma rápida explicação de como o menu de administração do WordPress é criado - não estou falando da add_menu_page
API, quero dizer o menu padrão do WordPress.
Chamando o arquivo de menu
O menu é, obviamente, carregado por wp-admin/admin.php
. Mas não é carregado pela API padrão que estamos acostumados, com base na documentação do WordPress. Em vez disso, o menu inteiro (todas as opções possíveis, submenus etc.) são carregados por meio de uma matriz simples definida em wp-admin/menu.php
.
Então, para carregar o sistema de menus, admin.php
basta require
percorrer a menu.php
linha 99 no WordPress 3.0.
Carregando o menu
O próprio menu é armazenado na matriz global $menu
. De acordo com a documentação em linha, a matriz de menus possui os seguintes elementos:
The elements in the array are:
* 0: Menu item name
* 1: Minimum level or capability required.
* 2: The URL of the item's file
* 3: Class
* 4: ID
* 5: Icon for top level menu
O painel, por exemplo, é:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
O arquivo passa e carrega cada item de menu na matriz e carrega todos os itens de submenu em uma matriz chamada $submenu
indexa com base na URL do menu pai. Portanto, o item do submenu do painel chamado "Painel" é:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Depois que o sistema terminar de carregar todos os menus (não há muitos, mas o sistema percorre o índice às 5 ou 10 horas ... observe que o Painel, mesmo sendo o primeiro item de menu, ainda está indexado como item "2" (as matrizes PHP iniciam no índice 0 ... então isso oferece a você espaço de manobra).
Neste ponto, o sistema chama wp-admin/includes/menu.php
.
Percorrendo o menu
Esse terceiro arquivo percorre cada item do menu e, com base nos privilégios atribuídos ao usuário atual, usa o menu ou remove-o. Primeiro, ele percorre todos os submenus e remove as páginas que o usuário não pode acessar. Em seguida, ele percorre as páginas pai e faz a mesma coisa. Em seguida, remove os separadores duplicados que permanecem por terem eliminado os menus.
Por fim, classifica os menus com base na ordem de menus atribuída.
Solicitando menus personalizados
O gancho admin_menu
é chamado depois que os menus são configurados, mas antes que qualquer coisa seja solicitada. Portanto, é possível solicitar todo o sistema de menus do WordPress sem "invadir" a API.
Depois que a ação admin_menu
é disparada, suas páginas personalizadas são carregadas no sistema. A próxima coisa que acontece é que o WordPress verifica um filtro chamado custom_menu_order
... esse filtro sempre é retornado false
e informa ao WordPress se você deseja ou não usar um pedido personalizado.
Adicione o seguinte ao seu tema para definir o sinalizador true
e defina sua ordem de menu explícita:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php', 'edit-comments.php');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
Especifique a ordem desejada para todos os menus (eu forneci referências ao arquivo de carregamento de menus para obter uma lista de nomes de arquivos) e isso deve ser resolvido.
EDIT (9/2/2010):
Para especificar a ordem da tela de edição de um tipo de postagem personalizado usando esse método, você precisa conhecer o URL da tela de edição. Na maioria dos casos, será http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Isso depende de como o WordPress está configurado no seu site (se estiver instalado na raiz ou em uma subpasta) e na lesma do tipo de postagem personalizada que você está usando.
Por exemplo...
Digamos que você tenha um tipo de postagem personalizado para 'Stack Exchange Questions' e deseje que o editor apareça na mesma seção do painel diretamente abaixo do ícone do painel. Você usaria o seguinte código no functions.php
arquivo do seu tema :
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
O restante do menu não será afetado, mas sua página de edição personalizada será movida para a mesma seção que o painel e aparecerá imediatamente abaixo dele. Você pode usar isso para mover seus tipos de postagem personalizados para qualquer seção do menu do administrador e colocá-los em qualquer ordem. Você também pode mover itens de menu padrão da mesma maneira.
Apenas certifique-se de especificar a ordem de todos os itens de menu na seção fornecida , caso contrário, seu menu poderá estar sujeito a alguma estranheza inesperada.