Alterando a Ordem das Seções do Menu Admin?

30

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

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

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

Eu estou supondo que alguns especialistas lendo isso podem me mostrar a maneira simples que eu posso ordenar o menu do admin exatamente da maneira que eu quero, utilizando o arquivo de funções e sem utilizar um plugin (que eu sei que existe).

Por favor, vá em frente e tente criar 5 tipos de post 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 isso? trabalho que alguém poderia compartilhar comigo ou de preferência sem utilizar jQuery?

    
por Binarybit 02.09.2010 / 01:46
fonte

6 respostas

33

Oi @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, eu não sei o que eles estavam pensando quando eles projetaram dessa maneira.

@EAMann fez um trabalho excelente explicando como os menus de administração funcionam no WordPress (eu gostaria de ter lido isso sobre 4 meses atrás ... :)

Ainda assim, depois que eu percebi como funcionava, eu ainda estava perdida para trabalhar com isso sem dedicar tempo suficiente para manter a cabeça reta enquanto tentava fazer coisas simples. É por isso que criei uma API de menu que simplifica e agiliza o trabalho com o menu de administração do WordPress.

Eles são 100% compatíveis com as estruturas existentes do WordPress e ainda são muito em alpha, já que eu tenho sido a única a usá-lo. Tenho certeza de que há casos de uso que eles ainda não manipulam. Mas vou postar o código aqui para você e outras pessoas tentarem.

Você pode baixar o arquivo para baixar no diretório do seu tema aqui: wp-admin -menu-classes.php e o que segue mostra como você pode chamar as funções no arquivo functions.php 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 são em consideração (como base) para inclusão no WordPress 3.1 então, se tivermos sorte, eles podem se tornar padrão!

    
por MikeSchinkel 02.09.2010 / 03:56
fonte
20

Aqui está uma rápida explicação de como o menu de administração do WordPress é construído - eu não estou falando da API add_menu_page , quero dizer o menu WordPress padrão real.

Chamando o arquivo de menu

O menu é, obviamente, carregado por wp-admin/admin.php . Mas não é carregado através da API padrão que estamos acostumados a usar com base na documentação do WordPress. Em vez disso, o menu inteiro (todas as opções possíveis, submenus, etc) é carregado por meio de uma matriz simples definida em wp-admin/menu.php .

Então, para carregar o sistema de menu, admin.php apenas require s menu.php ... na linha 99 no WordPress 3.0.

Carregando o menu

O menu em si é armazenado na matriz global $menu . De acordo com a documentação em linha, o array de menu tem estes 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 dos índices com base na URL do menu pai. Então, o item de submenu do Dashboard chamado "Dashboard" é:

 $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 Dashboard, mesmo sendo o primeiro item de menu, é ainda indexado como item "2" (matrizes PHP começam no índice 0 ... então isso lhe dá uma sala de manobra).

Neste ponto, o sistema chama wp-admin/includes/menu.php .

Percorrendo o menu

Este terceiro arquivo percorre cada item de menu e, com base nos privilégios atribuídos ao usuário atual, usa o menu ou o remove. Primeiro, percorre todos os submenus e remove as páginas que o usuário não pode acessar. Em seguida, ele faz um loop pelas páginas pai e faz a mesma coisa. Em seguida, remove quaisquer separadores duplicados que restem de eliminar os menus.

Por fim, ele classifica os menus com base na ordem de menu atribuída.

Como encomendar menus personalizados

O gancho admin_menu é chamado depois que os menus são configurados, mas antes tudo é pedido. Por isso, é possível encomendar todo o sistema de menus do WordPress sem "hackear" a API.

Após a ação admin_menu ser disparada, suas páginas personalizadas serão carregadas no sistema. A próxima coisa que acontece é que o WordPress verifica um filtro chamado custom_menu_order ... este filtro é sempre retornado false e diz ao WordPress se você deseja ou não usar uma ordem personalizada.

Adicione o seguinte ao seu tema para definir o sinalizador como true e defina sua ordem explícita de menu:

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 menu para que você possa obter uma lista de nomes de arquivos) e isso deve ser feito.

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 saber 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 é configurado em seu site (se estiver instalado na raiz ou em uma subpasta) e no espaço do tipo de postagem personalizado que você está usando.

Por exemplo ...

Digamos que você tenha um tipo de postagem personalizado para "Perguntas sobre o Stack Stack" e deseje que o editor seja exibido na mesma seção do painel, diretamente abaixo do ícone do painel. Você usaria o código a seguir no arquivo functions.php 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 do painel e aparecerá imediatamente abaixo dela. Você pode usar isso para mover seus tipos de postagem personalizados para qualquer seção do menu de administração 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 dada, caso contrário seu menu pode estar sujeito a alguma estranheza inesperada.

    
por EAMann 02.09.2010 / 03:22
fonte
18

Eu sei que este é um tópico antigo, mas acho que vale a pena atualizar com uma solução MUITO mais fácil. Por favor, note que isso funciona com 3.5 e não foi testado com qualquer outra versão. O código a seguir pode ser colocado em um plugin ou no arquivo functions.php.

Veja: enlace . Modificado ligeiramente para atender às necessidades do pôster original (no entanto, espero que ele tenha encontrado uma solução até 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');

Todos os itens no menu de administração que não estão listados aqui não serão removidos. Eles serão anexados ao final do menu.

    
por Matt 20.12.2012 / 20:21
fonte
2

Eu entendo que você não quer usar um plugin, mas por pura simplicidade, experimente o plugin Admin Menu Editor de Janis Elsts. Reorganize seus menus de administração da maneira que desejar; também pode ocultar itens de menu.

    
por Ray Gulick 04.09.2010 / 19:53
fonte
2

Para mover itens de menu, gosto de usar a variável% $menu global.

Por exemplo, se eu quisesse mover o menu "Páginas" para a parte inferior dos menus, eu usaria isso em functions.php ou em um plug-in:

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');

Já usei esse truque um pouco, apenas testei com o WP 3.4.1

    
por forlogos 08.11.2012 / 21:58
fonte
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, colocando o wp-admin-menu-classes.php na pasta do meu tema e agora o botão 'posts' é movido com o botão "páginas".

Espero que isso se torne parte do núcleo em breve e de uma forma que não seja necessário escrever todo o menu dentro de uma função para apenas reordenar dois botões.

Na verdade, foi um pouco complicado obter uma ordem mais específica para 4 botões. Para alterar os 4 botões para: Páginas, Postagens, 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');
    
por Sebastian 05.03.2012 / 06:36
fonte