Classificar itens de menu do administrador

8

Em uma nota relacionada a " Alterando a ordem das seções do menu Admin? ", Estou procurando uma maneira de classificar alfabeticamente as entradas em cada subseção da área administrativa do WordPress.

Atualmente, sempre que um novo plugin é adicionado, sua entrada aparece em um local aparentemente aleatório em Configurações / Ferramentas / Plugins, e geralmente é difícil localizar o novo item de menu. (Eu já tenho muitos plugins, então meus menus estão bem cheios.)

Sendo que adiciono e removo plugins com bastante regularidade, prefiro não precisar ir continuamente à página de configurações de um plug-in de pedidos de menu e ajustar a ordem.

Desculpe pela longa pergunta; Eu só quero deixar claro o que estou procurando.

Exemplo

Ao invés de:

    Definições
    - Geral
    - Escrita
    - Lendo
    - Discussão
    - (restante dos itens principais)
    - Plugin 4
    - WP alguma coisa
    - Um plugin para ajudar com coisas
    - plugin relacionado ao Google
    - plugin RSS
    - plugin FeedBurner
    - etc.

Posso ter o menu classificado em ordem alfabética (ou por outro método lógico), por exemplo:

    Definições
    - Um plugin para ajudar com coisas
    - Discussão
    - plugin FeedBurner
    - Geral
    - plugin relacionado ao Google
    - Plugin 4
    - Lendo
    - (restante dos itens principais)
    - plugin RSS
    - WP alguma coisa
    - Escrita
    - etc.

Melhor ainda, seria um método de classificação que mantenha as entradas principais onde estão por padrão e classifique apenas os itens adicionados pelos plugins:

    Definições
    - Geral
    - Escrita
    - Lendo
    - Discussão
    - (restante dos itens principais)
    - Um plugin para ajudar com coisas
    - plugin FeedBurner
    - plugin relacionado ao Google
    - Plugin 4
    - plugin RSS
    - WP alguma coisa
    - etc.
dgw
fonte

Respostas:

4

Isso pode ser feito classificando o global $submenu.

A classificação aplicada redefine o número da chave da sub-matriz $submenu['options-general.php'], que é:

array
  'options-general.php' => 
    array
      10 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      15 => 
        array
          0 => string 'Writing'
          1 => string 'manage_options'
          2 => string 'options-writing.php'
      // etc

e se torna:

array
  'options-general.php' => 
    array
      0 => 
        array
          0 => string 'Discussion'
          1 => string 'manage_options'
          2 => string 'options-discussion.php'
      1 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      // etc

Aqui, estamos considerando o comprimento dos itens padrão iguais a seis. Antes do WordPress 3.5, havia 7 itens. Agora , a privacidade desapareceu e foi incorporada à guia Leitura .

Testando localmente, isso não produz nenhum resultado inesperado e funciona bem. Talvez se um plugin dependesse de $submenu['options-general.php'][15]se posicionar ou de alguma outra coisa, poderiam ocorrer erros.

A classificação está sendo aplicada separadamente para os itens padrão e para o restante deles. Basta desativar o usortdo primeiro bloco e você terá a saída desejada.

add_action( 'admin_menu', 'sort_settings_menu_wpse_2331', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu['options-general.php'], 0, 6, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Sort rest of items
    $length = count( $submenu['options-general.php'] );
    $extra = array_slice( $submenu['options-general.php'], 6, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Apply
    $submenu['options-general.php'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

itens de menu reordenados

brasofilo
fonte
3

Eu estava procurando a mesma coisa e achei que copiava o código fornecido por Mike abaixo do qual ele afirma ainda estar muito em alfa, já que foi ele quem o usou.

Eu testei e parece funcionar bem para mim. Tenho certeza de que existem casos de uso que eles ainda não tratam.

Talvez Mike faça um comentário aqui e forneça ajuda adicional sobre como você pode usar a classe dele para alcançar seus objetivos.

Você pode fazer o download do arquivo para soltar no diretório do seu tema aqui: https://gist.github.com/792b7aa5b695d1092520

O que segue abaixo 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 ainda estão sendo consideradas (como base) para inclusão no WordPress 3.1; portanto, se tivermos sorte, elas podem se tornar padrão!

NetConstructor.com
fonte
Parece um ótimo código, mas não vejo onde ele classifica automaticamente as sub-entradas.
dgw
1

Achei que isso poderia ser útil como outra opção. Aqui está um exemplo simples no submenu global $. Eu uso o gancho admin_init, porque o admin_menu ainda pode ter outros plugins adicionando itens de submenu (no meu caso, isso aconteceu, então era muito cedo para fazer a classificação). Observe também que a função anônima (lambda) no usort requer PHP 5.3+.

<?php 
add_action('admin_init','my_admin_init');
function my_admin_init() {
    global $submenu;
    $submenu_key = 'my_key'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ 'My Item', 'read', 'manage-my-items', 'My Item' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}

Observe que $submenu_keyestá $parent_slugem add_submenu_page , que é o mesmo que $menu_slugem add_menu_page .

ryanm
fonte
11
Agradável e compacto. O que está $submenu_keyrepresentando? É isso que o WordPress chama $parent slugnos documentos add_submenu_page ?
random_user_name
@cale_b Ótima pergunta! Você está correto, está $parent_slugnos documentos add_submenu_page, que é o mesmo que $menu_slugem add_menu_page.
Ryanm 8/09