Classificar itens de menu do administrador

8

Em uma anotação 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 de administração do WordPress.

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

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

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

Exemplo

Em vez de:

    Settings
    - General
    - Writing
    - Reading
    - Discussion
    - (rest of core items)
    - Plugin 4
    - WP something
    - A plugin to help with stuff
    - Google-related plugin
    - RSS plugin
    - FeedBurner plugin
    - etc.

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

    Settings
    - A plugin to help with stuff
    - Discussion
    - FeedBurner plugin
    - General
    - Google-related plugin
    - Plugin 4
    - Reading
    - (rest of core items)
    - RSS plugin
    - WP something
    - Writing
    - etc.

Melhor ainda seria um método de classificação que mantém as entradas principais onde estão por padrão e apenas ordena os itens adicionados pelos plug-ins:

    Settings
    - General
    - Writing
    - Reading
    - Discussion
    - (rest of core items)
    - A plugin to help with stuff
    - FeedBurner plugin
    - Google-related plugin
    - Plugin 4
    - RSS plugin
    - WP something
    - etc.
    
por dgw 29.09.2010 / 01:33

3 respostas

4

Isso pode ser feito classificando o global $submenu .

A classificação aplicada redefine o número-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 igual a seis. Antes do WordPress 3.5, havia 7 itens, a Privacidade desapareceu e foi incorporada na guia Reading .

Teste localmente, isso não produz nenhum resultado inesperado e funciona bem. Talvez se um plugin dependesse de $submenu['options-general.php'][15] para se posicionar ou algo diferente, bugs poderiam acontecer.

A classificação está sendo aplicada separadamente para os itens padrão e para o restante deles. Apenas desative o usort do 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;
}
  

    
por brasofilo 08.01.2013 / 01:28
3

Eu estava procurando a mesma coisa e pensei em copiar o código fornecido por Mike abaixo, o qual ele afirma que ainda está muito em alfa, já que foi apenas ele quem o utilizou.

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

Talvez o Mike comente aqui e forneça ajuda adicional sobre como você pode usar a aula dele para atingir suas metas.

Você pode baixar o arquivo para soltar no diretório do seu tema aqui: enlace

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

    
por NetConstructor.com 29.09.2010 / 11:30
1

Pensei que isso poderia ser útil como outra opção. Aqui está um simples uso no submenu $ global. Eu uso admin_init hook, porque admin_menu ainda pode ter outros plugins adicionando itens de submenu (no meu caso, isso foi 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_key é $parent_slug em add_submenu_page , que é o mesmo que $menu_slug em add_menu_page .

    
por ryanm 07.09.2017 / 22:24