web-development-kb-pt.site

Alterar a ordem das seções do menu do administrador?

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 "dashboard" .

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

Eu estou supondo que alguns especialistas lendo isso podem me mostrar a maneira simples que eu posso pedir o menu de administração 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 esse trabalho que alguém poderia compartilhar comigo ou de preferência sem utilizar jQuery?

31
Binarybit

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.

@EAMannfiz um excelente trabalho de explicar como os menus admin funcionam no WordPress (eu gostaria de ter lido isso cerca de 4 meses atrás ... :)

Ainda assim, depois que eu descobri 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 estão em alpha, já que eu tenho sido o único 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 soltar no diretório do seu tema aqui: wp-admin-menu-classes.php e o que segue mostra como você pode chamar as funções em seu arquivo functions.php do 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 até sob consideração (como base) para inclusão no WordPress 3.1 então, se tivermos sorte, elas podem se tornar padrão!

33
MikeSchinkel

Aqui está uma rápida explicação de como o menu de administração do WordPress é construído - não estou falando da API add_menu_page, 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 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 através de uma matriz simples que é definida em wp-admin/menu.php.

Então, para carregar o sistema de menu, admin.php apenas requires 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 possui 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 percorre e carrega cada item de menu na matriz e carrega todos os itens de submenu em uma matriz chamada $submenu que indexa com base na URL do menu pai. Portanto, 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 no tempo de 5 ou 10 ... observe que o Dashboard, mesmo sendo o primeiro item de menu, ainda está indexado como item "2" (os arrays do 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 ter eliminado menus.

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

Encomenda de menus personalizados

O gancho admin_menu é chamado depois que os menus são configurados, mas antes qualquer coisa é ordenada. Portanto, é possível encomendar todo o sistema de menus do WordPress sem "hackear" a API.

Depois que a ação admin_menu for 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 informa 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 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 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 de uma tela de edição do tipo de postagem personalizada 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 apareça na mesma seção do painel, diretamente abaixo do ícone do painel. Você usaria o seguinte código 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.

21
EAMann

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: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Modificado ligeiramente para atender às necessidades do pôster original (embora, eu 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 acrescentados ao final do menu.

18
Matt

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

Estive usando este truque um pouco, apenas testei com WP 3.4.1

2
forlogos

Eu entendo que você não quer usar um plugin, mas por pura simplicidade, tente 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.

2
Ray Gulick

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

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 minha pasta de tema e agora o botão 'posts' é ativado com o botão 'páginas'.

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

Na verdade, foi um pouco complicado conseguir uma ordem mais específica para 4 botões. Para alterar os 4 botões 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');
0
Sebastian