Adicionando um Link Arbitrário ao Menu Admin?

20

Existe uma maneira de adicionar um hiperlink arbitrário ao menu de administração do WordPress (refiro-me ao menu à esquerda quando você faz login no painel administrativo)? Por exemplo, alguém pode adicionar um link ao Google?

No meu caso particular, gostaria de adicionar uma página de guia de estilo para um tema Wordpress em que estou trabalhando para mostrar ao usuário como elementos HTML diferentes são estilizados com o tema e para demonstrar como estilizar várias coisas .

Este é o código que tenho até agora ( nota: está incompleto ): Em functions.php eu adicionei um novo item de menu no Aparência seção:

add_action('admin_menu', 'create_theme_style_page');

function create_theme_style_page() {
  add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Not sure what goes here to redirect admin to a arbitrary url?";
}

Em build_styleguide_page() , a tentativa de redirecionamento com header() gera um erro ( Não é possível modificar as informações do cabeçalho ).

    
por Tom 30.08.2010 / 19:39

3 respostas

13

Oi @Tom ,

Se eu entendi sua pergunta corretamente, você não precisa saber como adicionar um link ao menu (parece que você já sabe disso), mas precisa aprender como redirecionar seu link corretamente, certo?

Redirecionando para um URL externo de um item de menu do administrador

Em caso afirmativo, o que você precisa fazer é não usar a função de item de menu, mas sim "ligar" o WordPress com antecedência suficiente para que não exporte nada, exceto possivelmente os cabeçalhos HTTP. O gancho mais antigo ao chamar /wp-admin/themes.php parece ser after_setup_theme e parece funcionar bem.

Use um "Menu Slug" para testar em um gancho

Mas, para que funcione, primeiro precisamos modificar sua chamada para add_theme_page na função admin_menu hook / your create_theme_style_page() . Descartamos o quinto parâmetro (a função a ser chamada para implementar a opção admin) porque não precisamos dele, e alteramos o quarto parâmetro (o "menu slug" ) para themes.php?goto=build-styleguide-page .

Embora pudéssemos ter escolhido quase literalmente qualquer coisa para o quarto parâmetro, dado que vamos redirecionar eu roteei para a mesma página ( themes.php ) como outras opções de aparência para consistência. Eu também apenas arbitrariamente inventei o nome goto porque o WordPress não o usa e parece fazer sentido para isso.

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Theme Styleguide',
    'Theme Styleguide',
    'administrator',
    'themes.php?goto=build-styleguide-page'
  );
}

BTW, nos livramos da sua função build_styleguide_page() porque não precisamos dela para essa solução.

Redirecionamento no primeiro gancho de themes.php : after_setup_theme

Como nosso último código, implementamos nosso after_setup_theme hook em nossa função redirect_from_admin_menu() . Temos que testar para ver se a página atual é themes.php e para garantir que um parâmetro de URL de goto foi passado na URL. Em seguida, ele testa o valor de goto usando uma instrução switch / case para ver se ele tem um valor de 'build-styleguide-page' ; se assim for, ele redireciona para o seu hipotético declarado, e. Google, caso contrário, apenas redirecionamos para o painel do administrador:

add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
  global $pagenow;
  if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
    switch ($_GET['goto']) {
      case 'build-styleguide-page':
        wp_redirect("http://www.google.com");
        break;
      default:
        wp_safe_redirect('/wp-admin/');
        break;
    }
    exit;
  }
}

Notas:

  1. Eu escolhi usar a instrução switch / case na função after_setup_theme hook / redirect_from_admin_menu() para que seja mais fácil adicionar redirecionamentos goto adicionais se você precisar; basta adicionar mais instruções de caso.

  2. as funções wp_redirect() e wp_safe_redirect() não terminam; você precisa explícito emitir uma declaração de saída para obter WordPress para parar e não substituir seu redirecionamento.

Espero que isso ajude!

    
por MikeSchinkel 30.08.2010 / 20:46
21

Se você adicionar o item ao menu adicionando-o diretamente à matriz $submenu , evitará a necessidade de redirecioná-lo e poderá usar um URL externo completo como o link do menu (eu mesmo faço isso) .

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' ); 
}  

index.php representa a chave / link do menu principal, portanto, no exemplo, estou basicamente adicionando um item ao menu Painel .

Claro, não é tão bonito quanto usar as funções add_{type}_page , mas funciona em torno do fato de o WordPress impedir URLs fora do site nos links do menu admin.

Eu uso algo semelhante para adicionar meus vários hosts virtuais no menu, para que eu possa alternar para outras instalações diretamente do menu admin (tudo feito com um script, mas basicamente usa uma versão glorificada do código acima).

OBSERVAÇÃO: Se você decidir usar o código, tenha cuidado para não atribuir uma chave que esteja em uso (a chave de matriz de 500 no código de exemplo).

DICA: Na verdade, você pode usar valores negativos nas teclas de menu, para poder forçar os itens de menu a serem colocados antes de qualquer um dos itens nativos do WordPress.

    
por t31os 09.11.2010 / 18:14
2

Eu consegui o mesmo com isso:

function add_custom_menu_item(){
    add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );

function custom_menu_item_redirect() {

    $menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;

    if($menu_redirect == 'page_slug' ) {
        wp_safe_redirect( home_url('/my-page') );
        exit();
    }

}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );

O que você faz aqui é adicionar o item de menu e definir o slug, depois em 'admin_init' você verifica se o slug existe e redireciona para o local desejado.

    
por Bobz 21.01.2015 / 22:15