Adicionar um separador ao menu Admin?

22

Alguém sabe como adicionar um separador de menus de administração? Eu encontrei isso, mas não ajudou.

Alguma ideia?

user1147
fonte
Caso alguém ainda esteja procurando a resposta, esse plug-in pode lidar com o trabalho.
User31760 de

Respostas:

33

Aqui está uma maneira rápida e suja de obter o que deseja.

fundo

O WordPress armazena seções do menu de administração em uma matriz global chamada $menu. Para adicionar um separador, você adiciona um elemento à $menumatriz usando um índice entre os índices das opções que deseja separar.

Usando a add_admin_menu_separator()função

Então, eu escrevi uma função para encapsular a lógica para isso que chamei add_admin_menu_separator(). Você precisará escolher um número de índice da matriz que seja mais alto do que a opção após a qual deseja adicionar um separador e chamar a função que add_admin_menu_separator()passa o referido índice como seu parâmetro.

Por exemplo:

add_admin_menu_separator(37);

A add_admin_menu_separator()própria função

Aqui está a definição da função add_admin_menu_separator()que você pode copiar no functions.phparquivo do seu tema . Sim, é misterioso, mas também o código que cria e usa a $menumatriz global . (Os planos são para acabar com isso, felizmente, mas isso provavelmente vai levar alguns anos.)

function add_admin_menu_separator($position) {
  global $menu;
  $index = 0;
  foreach($menu as $offset => $section) {
    if (substr($section[2],0,9)=='separator')
      $index++;
    if ($offset>=$position) {
      $menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
      break;
    }
  }
  ksort( $menu );
}

Localizando o índice em $menuque você precisa

Para descobrir o número de índice que você precisa você pode fazer uma da partir de um gancho. Aqui está um pouco de código que você pode soltar temporariamente no arquivo do seu tema para ver quais são os valores. Isso funcionará apenas ao solicitar um URL que comece com (mas certifique-se de usar o FTP e não o editor de temas embutido, ou você perderá o acesso ao seu site, pelo menos até obter acesso FTP ao arquivo do tema !) : var_dump()$GLOBALS['menu']admin_initfunctions.php/wp-admin/ functions.php

add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
  if (is_admin()) {
    header('Content-Type:text/plain');
    var_dump($GLOBALS['menu']);
    exit;
  }
}

Veja também:

BTW, você pode achar esses links úteis em geral para trabalhar com menus de administração:

Embora minhas classes de menu do administrador atualmente não ofereçam uma maneira fácil de adicionar separadores, acho que agora adicionarei isso quando tiver tempo.

MikeSchinkel
fonte
Obrigado Mike, eu verifiquei a noite toda estudando o menu var global, mas não consegui adicionar um separador, agora ficou muito mais claro para mim como os menus funcionam no wp.
usar o seguinte comando
Oi @ user1147 : Sim, eles são muito difíceis de descobrir. Quando precisei, demorei bastante tempo e ainda luto com eles. Daí porque eu escrevi essas funções, para que eu possa fazer isso da maneira mais fácil a partir de agora! De qualquer forma, feliz que minha resposta tenha ajudado.
7278 MikeSchinkel
1
@ MikeSchinkel Este método não está funcionando para mim com o Wordpress 3.3.1.
Jim Geurts
1
@JimGeurts - também não está funcionando para mim: /
Evan Mattson
2
Acabei de testá-lo e ele "funciona" na versão 4.5, mas o WordPress decidiu se livrar das linhas, pois elas simplesmente não aparecem mais. Eu acho que a solução é adicionar CSS, mas, para a vida toda, não consigo descobrir qual CSS adicionar, pois sou um desenvolvedor de back-end e sou péssimo em CSS. Talvez alguém possa sugerir?
MikeSchinkel
4

É fácil como:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $menu = array_merge(
        array_slice( $menu, 0, $pos ),
        array( $sep ),
        array_slice( $menu, $pos + 1, -1)
    );
    $menu[ $pos - 1 ][4] .= ' menu-top-last';
    $menu[ $pos + 1 ][4] .= ' menu-top-first';

}

Nota: A posição padrão do separador ( $menu[4]) pode ser diferente dependendo da configuração que você (ou seus plug-ins) fez antes deste gancho.

Obviamente, você também pode ajustar a introspecção menu-top-firste menu-top-lastclasses.

vmassuchetto
fonte
2

Teve alguns problemas com os separadores não serem adicionados, foi devido à maneira como o wordpress remove separadores duplicados. A adição ksort($menu);à parte inferior da função corrigiu o problema.


fonte
1

Isso se baseia na resposta do MastaBaba, mas não substitui nada na posição especificada - apenas adiciona o separador posteriormente.

Também usa uma função anônima, por isso é compatível apenas com o PHP versão 5.3 e superior.

add_action( 'admin_menu', function () {
    $position = 29;
    global $menu;
    $separator = [
        0 => '',
        1 => 'read',
        2 => 'separator' . $position,
        3 => '',
        4 => 'wp-menu-separator'
    ];
    if (isset($menu[$position])) {
        $menu = array_splice($menu, $position, 0, $separator);
    } else {
        $menu[$position] = $separator;
    }
});
robrecord
fonte
0

É um pouco difícil determinar o que você está tentando fazer, mas acho que você deseja adicionar uma entrada de nível superior no menu de administração do WordPress.

Veja esta documentação no WordPress Codex.

Em resumo, você está procurando o uso da add_menu_page()função, que usa vários argumentos e exibe um item adicional no menu administrativo como um irmão de "Painel", "Postagens", "Mídia" etc.

Espero ter acertado. :-)

dgw
fonte
Estou apenas tentando adicionar um separador de menu de administração. Antes de postar a pergunta, tentei usar add_menu_page().
user1147
Parece que MikeSchinkel te cobriu muito bem. Desculpe pelo mal-entendido. Boa sorte!
Dgw 07/10/10
0

A seguir, anúncios para o Wordpress uma ação que é executada quando o menu do administrador é renderizado. O menu admin é uma matriz e tudo o que você está fazendo aqui é adicionar um elemento da matriz que define um separador, na posição que você especificar.

A partir daqui :

add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0   =>  '',
1   =>  'read',
2   =>  'separator' . $position,
3   =>  '',
4   =>  'wp-menu-separator'
);
}

Observe que, embora isso se assemelhe à resposta atualmente aceita, a resposta atualmente aceita não funcionou para mim (e, a julgar pelos comentários, para várias outras).

MastaBaba
fonte
Não há diferença para a resposta existente aceita, exceto que você não fornece nenhuma explicação. Por favor, leia Como responder .
fuxia
@toscho: Bem, isso funciona para mim e a resposta aceita não.
MastaBaba