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 de administração)? 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 do Wordpress em que estou trabalhando, para mostrar ao usuário como diferentes elementos HTML são estilizados com o tema e demonstrar como estilizar várias coisas bem.

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

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?";
}

Ao build_styleguide_page()tentar redirecionar com, header()ocorre um erro ( Não é possível modificar as informações do cabeçalho ).

Tom
fonte

Respostas:

13

Olá @Tom ,

Se 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 fazer com que seu link seja redirecionado corretamente, certo?

Redirecionando para um URL externo a partir de um item de menu Admin

Nesse caso, o que você precisa fazer é não usar a função do item de menu, mas, em vez disso, "ligar" o WordPress o suficiente para que ele não produza nada, exceto possivelmente os cabeçalhos HTTP. O gancho mais antigo ao ligar /wp-admin/themes.phpparece ser after_setup_themee parece funcionar bem.

Use um "Menu Slug" para que você possa testá-lo em um gancho

Mas, para que funcione, primeiro precisamos modificar sua chamada add_theme_pageno admin_menugancho / sua create_theme_style_page()função. Abandonamos 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" ) themes.php?goto=build-styleguide-page.

Embora pudéssemos escolher quase literalmente qualquer coisa para o quarto parâmetro, dado que vamos redirecionar, eu direcionei para a mesma página ( themes.php) como outras opções de aparência para obter consistência. Eu também inventei arbitrariamente o nome gotoporque 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 build_styleguide_page()função porque não precisamos dela para esta solução.

Redirecionar no gancho mais antigo para themes.php:after_setup_theme

Como nosso último pedaço de código, implementamos nosso after_setup_themegancho em nossa redirect_from_admin_menu()função. Temos o teste para verificar se a página atual é themes.phpe para garantir que um parâmetro de URL gotoseja passado na URL. Em seguida, ele testa o valor do gotouso de uma instrução switch/ casepara verificar se ele possui um valor de 'build-styleguide-page'; nesse caso, ele será redirecionado para o hipotético declarado, por exemplo, o Google, caso contrário, apenas o redirecionaremos 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/ caseno after_setup_themegancho / redirect_from_admin_menu()função para que fosse mais fácil adicionar gotoredirecionamentos adicionais, se necessário; basta adicionar mais instruções de caso.

  2. as funções wp_redirect()e wp_safe_redirect()na verdade não terminam; você precisa emitir explicitamente uma declaração de saída para que o WordPress pare e não substitua seu redirecionamento.

Espero que isto ajude!

MikeSchinkel
fonte
22

Se você adicionar seu item ao menu, adicionando-o $submenudiretamente à matriz, evitará a necessidade de redirecionar 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.phprepresenta 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 add_{type}_pagefunções, mas evita o fato de o WordPress impedir URLs externos nos links do menu do administrador.

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

NOTA: Se você decidir usar o código, tome cuidado para não atribuir uma chave em uso (a chave da matriz 500 no código de exemplo).

DICA: Na verdade, você pode usar valores negativos nas teclas de menu para forçar os itens de menu a ficarem diante de qualquer item nativo do WordPress.

t31os
fonte
NOTA: Eu acho que você precisará definir essa chave negativa como uma string, ou seja. '-5'e não -5, então a chave é considerada inválida (eu acho) .. (cordas negativas funciona, porém, se não estou enganado) ..
t31os
Obrigado, é uma pena que você não possa fazê-lo com as funções reais, mas isso é muito melhor do que adicionar um combo de gancho / redirecionamento apenas para ter um link.
El Yobo
2
Essa resposta em particular me ajudou com o meu plugin Post Status Menu Items (você provavelmente pode adivinhar o que ele faz). De qualquer forma, como eu não sabia quais outros plugins estariam adicionando itens a quais menus, pensei em acrescentar que costumava array_push()acrescentar os itens do menu para evitar colisões com outros plugins.
mrwweb
Funciona como um encanto, além de um ponto de bônus por usar um pequeno trecho.
João
2
+1. Em vez de escolher uma chave e esperar, basta pegar a última chave e aumentar. Por exemplo, ao adicionar um item de submenu ao menu Ferramentas: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = etc.
webaware
3

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 um item de menu e definir slug, depois em 'admin_init' você verifica se existe slug e redireciona para o local desejado.

Bobz
fonte