Como posso controlar a posição no menu de administração dos itens adicionados pelos plugins?

8

Tendo lido em outro lugar na pilha de dois plugins WP forçando posições de menu idênticas (com a probabilidade de um não aparecer), estou pensando em como posso controlar a posição dos itens de menu adicionados pelos plugins.

Eu já uso uma função que parece lidar com esses itens de submenu em 'configurações' e outra função para reordenar os itens padrão (postagens, páginas, temas, plugins, configurações etc.) 'nível superior' - mas que não altera o posicionamento desses itens adicionados por plug-ins.

function custom_menu_order() {
return array(
//Add items here in desired order.

);
}

add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'custom_menu_order' );

Como exemplo, dos dois itens de menu de nível superior adicionados pelo WooCommerce, um aparece acima do item adicionado pelo ContactForm7 e o outro abaixo, e seria bom reordená-los adequadamente - e também, para poder reorganizar melhor os itens que não força a posição do menu e aparece na parte inferior.

Acho que geralmente funciona bem para reordenar os itens padrão e 'edit.php? Post_type = ...', mas aqueles com 'admin.php? Page = ...' não são reordenados.

Quando minha função de reordenar é desativada, os dois itens do WooCommerce ('edit.php? Post_type = product' e 'edit.php? Post_type = shop_order') se agrupam conforme o esperado, mas quando a função é reativada, eles são divididos por ContactForm7 ('admin.php? page = wpcf7').

E um ('edit.php? Post_type = shop_order') dos CPTs do WooCommerce não será reordenado - embora o outro ('edit.php? Post_type = product') o faça.

glvr
fonte

Respostas:

8

Para alterar a ordem dos itens do menu administrativo de nível superior, você precisará de dois hooks, dois filterse um function. Coloque o seguinte código no tema atual functions.php:

function wpse_custom_menu_order( $menu_ord ) {
    if ( !$menu_ord ) return true;

    return array(
        'index.php', // Dashboard
        'separator1', // First separator
        'edit.php', // Posts
        'upload.php', // Media
        'link-manager.php', // Links
        'edit-comments.php', // Comments
        'edit.php?post_type=page', // Pages
        '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', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

A matriz retornada dos itens de menu do administrador de nível superior, acima, representa os itens de menu inseridos pelo núcleo, na ordem padrão. Para incluir itens de menu adicionados por plug-ins, precisamos adicioná-los a esse array. Digamos que temos dois plugins adicionados e ativados (por exemplo: Wordfencee NextCellent Gallery). Primeiro temos que encontrar os nomes desses itens de menu. Quando clicamos no Wordfenceitem de menu de nível superior, o URL resultante termina com ?page=Wordfence. A parte depois ?page=é o nosso nome ( Wordfence). Pois NextCellent Gallery, o nome será nextcellent-gallery-nextgen-legacy. Agora, vamos adicionar esses itens à nossa matriz:

return array(
    'index.php', // Dashboard
    'separator1', // First separator
    'edit.php', // Posts
    'upload.php', // Media
    'link-manager.php', // Links
    'edit-comments.php', // Comments
    'edit.php?post_type=page', // Pages
    'separator2', // Second separator
    'themes.php', // Appearance
    'plugins.php', // Plugins
    'users.php', // Users
    'tools.php', // Tools
    'separator3', // Third separator
    'options-general.php', // Settings
    'separator-last', // Last separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Agora, podemos mover itens dessa matriz, para cima e para baixo, para obter o pedido final.

Nota : você também pode usar o plugin Admin Menu Editor , para ações fáceis de arrastar e soltar.

Frank P. Walentynowicz
fonte
1
@ Frank P. Walentynowicz ... obrigado pela resposta abrangente. Atualizei minha postagem original para esclarecer, e sua sugestão de usar 'a parte depois de? Página =' é muito útil e resolve o meu problema - exceto um dos dois itens do WooCommerce.
glvr
Adição rápida ao meu comentário acima: eu já havia usado o Admin Menu Editor, mas prefiro uma função codificada.
glvr
11

As respostas existentes são boas, mas se você adicionasse um novo tipo de postagem personalizado, teria que reeditar essas funções novamente.

Para consertar isso, desenvolvi essa pequena função. Basta definir seu $new_positionsinterior na my_new_menu_orderfunção:

/**
 * Activates the 'menu_order' filter and then hooks into 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filters WordPress' default menu order
 */
function my_new_admin_menu_order( $menu_order ) {
  // define your new desired menu positions here
  // for example, move 'upload.php' to position #9 and built-in pages to position #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // helper function to move an element inside an array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // traverse through the new positions and move 
  // the items if found in the original menu_positions
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};
rassoh
fonte
1
Isso é incrível - portanto, quando novos itens forem adicionados como um item de menu, como um tipo de postagem personalizado (como você sugeriu) ou um novo plug-in ou até mesmo uma nova opção integrada no futuro, eles serão adicionados da maneira mais normal possível ?
Brett
@Brett Parece que funcionaria assim.
Davey
6

Ao criar um tipo de postagem com register_post_type (), você pode definir a posição do menu:

posição_menu (inteiro) (opcional) A posição na ordem dos menus em que o tipo de postagem deve aparecer. show_in_menu deve ser verdadeiro.

    Default: null - defaults to below Comments 

    5 - below Posts
    10 - below Media
    15 - below Links
    20 - below Pages
    25 - below comments
    60 - below first separator
    65 - below Plugins
    70 - below Users
    75 - below Tools
    80 - below Settings
    100 - below second separator

Se os itens tiverem a mesma posição de menu, eles serão classificados em ordem alfabética.

no seu próprio plugin, você pode definir o nível. se você estiver tentando alterar a posição do menu de um plug-in que não criou, muitos deles podem ser plugáveis ​​ou você pode editar as chamadas deles.

Rudtek
fonte
@ Rudtek ... obrigado. Em meus próprios CPTs, evitei definir as posições do menu, preferindo usar uma reordenação do menu e, assim, 'ter tudo no mesmo lugar' e facilitar a alteração subsequente. Não tendo plug-ins próprios para os quais estou tentando definir a posição do menu, é para plug-ins de terceiros - para os quais não sei o suficiente sobre 'conectável' ou para editar suas chamadas (que provavelmente seriam substituídas na atualização).
glvr