Alterando a ordem das seções do menu Admin?


31

Estou ficando um pouco frustrado por aqui depois de passar algumas horas tentando realizar essa tarefa bastante simples sem sorte.

Essencialmente, eu tenho 5 tipos de postagem personalizados que criei e tudo o que quero fazer é mostrar cada um deles em uma ordem específica diretamente no "painel" .

A partir da documentação do WordPress, parece que você realmente não pode fazer isso porque a ordem do menu mais alta parece ser "5". E acima de L

Suponho que algum especialista lendo isso possa me mostrar a maneira simples de solicitar o menu de administração exatamente da maneira que eu quero, utilizando o arquivo de funções e sem utilizar um plug-in (que eu sei que existe).

Vá em frente e tente criar 5 tipos de postagem separados e incluí-los em uma ordem específica diretamente sob o painel ... parece que isso não é possível. ?? ... existe algum tipo de jquery hack para fazer com que alguém funcione poderia compartilhar comigo ou de preferência sem utilizar o jQuery?

Respostas:


33

Olá, @BinaryBit:

Não é de admirar que você esteja um pouco frustrado; o menu admin é uma das implementações mais obtusas e frustrantes através do núcleo do WordPress. Honestamente, não sei o que eles estavam pensando quando o projetaram dessa maneira.

O @EAMann fez um excelente trabalho ao explicar como os menus de administração funcionam no WordPress (eu gostaria de poder ler isso há cerca de 4 meses ... :)

Ainda assim, depois que eu descobri como funcionava, ainda não consegui trabalhar com ela, sem dedicar tempo suficiente para manter minha cabeça reta enquanto tentava fazer coisas simples. Por isso, criei uma API de menus que simplifica e simplifica o trabalho com o menu de administração do WordPress.

Eles são 100% compatíveis com as estruturas existentes do WordPress e ainda muito em alfa, já que eu fui o único a usá-lo. Tenho certeza de que existem casos de uso que eles ainda não tratam. Mas postarei o código aqui para você e outras pessoas experimentarem.

Você pode fazer o download do arquivo para soltar no diretório do seu tema aqui: wp-admin-menu-classes.php e o seguinte mostra como você pode chamar as funções no functions.phparquivo do seu tema :

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

Além disso, essas funções ainda estão sendo consideradas (como base) para inclusão no WordPress 3.1; portanto, se tivermos sorte, elas podem se tornar padrão!


Adição fantástica à API! Levei meses para adicionar minha primeira seção de menu personalizada à estrutura existente (e foi por isso que estudei muito o código) ... mas sua API parece muito mais intuitiva de usar!
EAMann

@EAMann - Obrigado! Se você quiser oferecer alguma sugestão ou até mesmo colaborar para melhorá-la, eu adoraria estabelecer algo que facilitasse a todos, exceto apenas os poucos que assistiram a essas perguntas e respostas.
MikeSchinkel 03/09/10

isso tornou o núcleo ou isso ou algo semelhante ainda é necessário para manipular a ordem dos itens de menu no administrador?
Q Studio

Tanto quanto eu ter encontrado, ele foi adiado para WP 3.5
pixeline

Hey Mike - wp_debug lança um erro nesta função: -------- function swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); retornar $ seção; } --- Aviso: Variável indefinida: section
Q Studio

21

Aqui está uma rápida explicação de como o menu de administração do WordPress é criado - não estou falando da add_menu_pageAPI, 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.phpbasta requirepercorrer a menu.phplinha 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 $submenuindexa 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 falsee informa ao WordPress se você deseja ou não usar um pedido personalizado.

Adicione o seguinte ao seu tema para definir o sinalizador truee 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.phparquivo 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.


Há um pequeno erro no seu código de exemplo no cabeçalho "Ordenando menus personalizados", a instrução if condicional está ausente $no nome da variável ... (Ótima resposta) ..
t31os 17/11/2010

Como você adicionaria o tipo de postagem personalizado para "Perguntas sobre o Exchange Stack" a uma seção abaixo da seção Painel?
epaps 31/05

Oi EAMann - pergunta rápida. Desde a versão mais recente do wordpress este processo mudou ou se tornou mais simples?
NetConstructor.com

Que tal para submenus ? Existe um método semelhante para reorganizar os itens do submenu ?
Giraldi

@GiraldiMaggio Por favor, faça uma nova pergunta e faça referência a esta.
EAMann

18

Sei que esse é um tópico antigo, mas acho que vale a pena atualizar com uma solução MUITO mais fácil. Observe que isso funciona com o 3.5 e não foi testado com nenhuma outra versão. O código a seguir pode ser colocado em um plug-in ou no arquivo functions.php.

Veja: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Modificado um pouco para atender às necessidades do pôster original (espero que ele tenha encontrado uma solução agora ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

Quaisquer itens no menu do administrador que não estejam listados aqui não serão removidos. Eles serão anexados à parte inferior do menu.


1
Sim, isso é muito melhor, também para reordenar itens do submenu que você pode desarmar e depois redefini-los.
quer

2

Entendo que você não deseja usar um plug-in, mas, para pura simplicidade, tente o plug-in Admin Menu Editor de Janis Elsts. Reorganize seus menus de administrador da maneira que desejar; também pode ocultar itens de menu.


Eu tentei este plugin na instalação multisite. Funciona melhor. Mas precisamos configurar manualmente as opções para cada subsite, se tivermos instalação multisite.
user391

2

Para mover itens de menu, eu gosto de usar a $menuvariável Global .

Por exemplo, se eu quisesse mover o menu "Páginas" para a parte inferior dos menus, usaria isso no functions.phpou em um plugin:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

e se eu quiser trocar os menus Posts e Links:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Utilizo esse truque há algum tempo, apenas testado com o WP 3.4.1


Sei que este é um cargo mais velhos, mas com relação ao seu primeiro correu trecho I em um problema com a última linha na admin_menu_itemsfunção que foi fixado, substituindo-ounset($menu[20]);
hot_barbara

0

Impressionante. Muito obrigado. Acabei de colocar algumas linhas de código em minhas funções.php

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

Além disso, coloque o wp-admin-menu-classes.php na minha pasta de temas e agora o botão 'posts' é trocado pelo botão 'pages'.

Espero que isso faça parte do núcleo em breve e de certa forma, para que não precisemos escrever o menu inteiro dentro de uma função para reordenar apenas dois botões.

Na verdade, foi um pouco complicado obter uma ordem mais especificada para 4 botões. Para alterar os botões de 4 para: Páginas, Post, Mídia, Links, eu precisava usar o seguinte código:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.