web-development-kb-pt.site

Adicionando um link arbitrário ao menu do administrador?

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 do administrador)? 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 que eu possa mostrar ao usuário como elementos HTML diferentes são estilizados com o tema e para demonstrar como estilizar várias coisas bem.

Este é o código que tenho até agora ( note: está incompleto ): Em functions.php Eu 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?";
}

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

20
Tom

Oi @Tom,

Se eu entendi a sua pergunta corretamente, você não precisa saber como adicionar um link ao menu (parece que você já sabe disso), mas sim aprender como redirecionar o 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 em vez disso "gancho" WordPress cedo o suficiente para que não tenha saído nada, exceto possivelmente 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" Então você pode testar isso 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 ser 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 surgiu com 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 esta solução.

Redirecionamento no gancho anterior para themes.php:after_setup_theme

Como nosso último pedaço de código, implementamos nosso gancho after_setup_theme 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 goto foi passado na URL. Em seguida, ele testa o valor de goto usando uma instrução switch/case para ver se tem um valor 'build-styleguide-page'; se assim for, ele redireciona para o seu hipotético declarado, e. Google, caso contrário, apenas redirecionamos de volta 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 variável switch/case na função after_setup_theme hook/redirect_from_admin_menu() para que seja mais fácil adicionar redirecionamentos adicionais goto 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 o WordPress para parar e não substituir seu redirecionamento.

Espero que isto ajude!

13
MikeSchinkel

Se você adicionar seu item no menu adicionando-o diretamente à matriz $submenu, você 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 pai, então no exemplo eu estou basicamente adicionando um item ao menu Dashboard ..

Claro, não é tão bonito quanto usar as funções add_{type}_page, mas funciona ao redor do fato de que o WordPress previne URLs externos 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 de administração (tudo feito com um script, mas basicamente usa uma versão glorificada do código acima).

NOTA: 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: Você pode realmente usar valores negativos nas teclas de menu para, assim você pode forçar itens de menu para se sentar antes de qualquer um dos itens nativos do WordPress.

21
t31os

Eu consegui o mesmo com isto:

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

3
Bobz