Uma das coisas sobre trabalhar com a API de menu do WordPress (que é add_menu_page, add_submenu_page e similares) é que não facilita a reordenação dos itens do submenu.
Claro, para certas coisas, como taxonomias ou coisas assim, você pode apenas alterar a ordem em que elas são registradas. Mas digamos que você tenha um menu de administração do WordPress e algumas páginas de submenu nesse menu específico.
Por padrão, o WordPress cria o menu de nível superior e, em seguida, cria imediatamente um item de submenu no menu de nível superior que vincula à mesma página. Em muitos casos, isso pode ser o ideal.
Em alguns casos, porém, você pode querer mudar isso.
Menu de administração do WordPress
Para dar um exemplo de quando você pode querer mudar algo, pode ser algo assim:
- Você tem um menu de nível superior que oferece opções após a conexão com uma API de terceiros,
- A API de terceiros requer uma chave de API (ou alguma outra autenticação), então você precisa fornecer configurações para isso primeiro,
- Por que não tornar o primeiro item de menu Configurações e o segundo item de menu as Ferramentas de API reais?
Obviamente, quando as configurações não foram definidas, é útil também exibir uma mensagem no menu principal de Ferramentas da API informando que o usuário deve clicar na página Configurações para inserir suas configurações.
Mas isso está além do escopo deste post. Por enquanto, aqui está uma maneira de gerenciar a reordenação do menu do lado do servidor. Primeiro o código, depois a explicação.
<?php
add_action('custom_menu_order', __NAMESPACE__.'acmeReorderSubmenuItems);
/**
* Reorders the menu by placing the second item before the first item.
*/
function acmeReorderSubmenuItems()
{
global $submenu;
$newSubmenu = [];
foreach ($submenu as $menuName => $menuItems) {
if ('acme-api-tools' === $menuName) {
$newSubmenu[0] = $menuItems[1];
$newSubmenu[1] = $menuItems[0];
$submenu['acme-api-tools'] = $newSubmenu;
break;
}
}
}
De um modo geral, estou usando isso no contexto de um objeto com namespace, mas para este post, estou relegando-o a uma função que existe em um namespace.
Algumas coisas a serem observadas:
- Estou usando o gancho custom_menu_order que é um lugar ideal para trabalhar nos itens de menu no WordPress,
- Estou procurando especificamente o submenu acme-api-tools na chave $menuName da variável de array $submenu ,
- Eu crio uma matriz, $newSubmenu e, em seguida, troco os itens e atribuo o novo submenu ao submenu existente identificado pela chave.
Existem alguns comentários – talvez até problemas (ou pelo menos considerações sérias) – com esta abordagem.
Ou seja, o código espera saber precisamente a chave com a qual estamos procurando trabalhar. Em alguns casos, isso é bom, mas se você deseja modificar um menu para o qual não conhece a chave (como acme-api-tools ), precisará alterar isso.
Em seguida, isso também pressupõe que há apenas dois itens de menu para trocar. É bastante fácil no caso acima, mas se houvesse mais, você provavelmente precisaria de uma função para lidar com a movimentação das coisas e retornar a nova matriz.
O suficiente para começar
Dito isso, a funcionalidade acima deve fornecer informações suficientes para pelo menos como começar a fazer isso, se não mais, e como manipular a matriz do submenu visível