¿Agregar un enlace arbitrario al menú Admin?

20

¿Hay alguna manera de agregar un hipervínculo arbitrario al menú de administración de WordPress (me refiero al menú de la izquierda cuando inicia sesión en el panel de administración)? Por ejemplo, ¿se puede agregar un enlace a Google?

En mi caso particular, me gustaría agregar una página de guía de estilo para un tema de Wordpress en el que estoy trabajando para poder mostrarle al usuario cómo se diseñan los diferentes elementos HTML con el tema y mostrar cómo diseñar varias cosas con estilo.

Este es el código que tengo hasta ahora ( nota: está incompleto ): En functions.php he agregado un nuevo elemento de menú en la sección Apariencia :

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

En build_styleguide_page(), intentar redirigir header()da un error ( No se puede modificar la información del encabezado ).

Tom
fuente

Respuestas:

13

Hola @ Tom ,

Si entiendo su pregunta correctamente, no necesita saber cómo agregar un enlace al menú (parece que ya lo sabe), sino que debe aprender cómo hacer que su enlace se redirija correctamente, ¿verdad?

Redirigir a una URL externa desde un elemento del menú Admin

Si es así, lo que debe hacer es no usar la función del elemento del menú, sino "enganchar" WordPress lo suficientemente temprano como para que no genere nada excepto posiblemente encabezados HTTP. El primer enganche al llamar /wp-admin/themes.phpparece ser after_setup_themey parece funcionar bien.

Use un "Menú Slug" para que pueda probarlo en un gancho

Pero para que funcione, primero debemos modificar su llamada add_theme_pageen el admin_menuenlace / su create_theme_style_page()función. Eliminamos el quinto parámetro (la función para llamar para implementar la opción de administrador) porque no lo necesitamos, y cambiamos el cuarto parámetro ( "babosa de menú" ) para que sea themes.php?goto=build-styleguide-page.

Aunque podríamos haber elegido casi literalmente cualquier cosa para el cuarto parámetro, dado que vamos a redirigir, enrute a la misma página ( themes.php) que otras opciones de apariencia para mantener la coherencia. También se me ocurrió el nombre arbitrariamente gotoporque WordPress no lo usa y parece tener sentido para esto.

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'
  );
}

Por cierto, nos deshicimos de su build_styleguide_page()función porque no la necesitamos para esta solución.

Redireccionar en el gancho más antiguo para themes.php:after_setup_theme

Como nuestro último fragmento de código, implementamos nuestro after_setup_themeenlace en nuestra redirect_from_admin_menu()función. Tenemos que probar para ver si la página actual es themes.phpy para asegurarnos de que gotose pasó un parámetro de URL en la URL. Luego prueba el valor de gotousar una instrucción switch/ casepara ver si tiene un valor de 'build-styleguide-page'; si es así, se redirige a su hipotética declarada, por ejemplo, Google, de lo contrario, simplemente redirigimos al panel de administración:

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. Elegí usar la instrucción switch/ caseen el after_setup_themeenlace / redirect_from_admin_menu()función para que sea más fácil agregar gotoredireccionamientos adicionales si es necesario; simplemente agregue más declaraciones de casos.

  2. las funciones wp_redirect()y wp_safe_redirect()no terminan realmente; debe emitir explícitamente una declaración de salida para que WordPress se detenga y no anule su redirección.

¡Espero que esto ayude!

MikeSchinkel
fuente
22

Si agrega su elemento al menú agregándolo $submenudirectamente a la matriz, evitará la necesidad de hacer la redirección y podrá usar una URL externa completa como enlace del menú (lo hago yo mismo).

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 la clave / enlace del menú principal, por lo que, en el ejemplo, básicamente estoy agregando un elemento al menú del Tablero ...

Claro, no es tan bonito como usar las add_{type}_pagefunciones, pero evita el hecho de que WordPress evite las URL fuera del sitio en los enlaces del menú de administración.

Utilizo algo similar para agregar mis diversos hosts virtuales al menú, por lo que puedo cambiar a otras instalaciones directamente desde el menú de administración (todo hecho con un script, pero básicamente usa una versión glorificada del código anterior).

NOTA: Si decide usar el código, tenga cuidado de no asignar una clave que esté en uso (la clave de matriz 500 en el código de ejemplo).

SUGERENCIA: en realidad puede usar valores negativos en las teclas de menú para, de modo que puede forzar sus elementos de menú a sentarse antes que cualquiera de los elementos nativos de WordPress.

t31os
fuente
NOTA: Sin embargo, creo que necesitará establecer esa clave negativa como una cadena, es decir. '-5'y no -5, de lo contrario la clave es considerado no válido (creo) .. (cadenas negativas trabaja sin embargo, si no me equivoco) ..
t31os
Gracias, apesta que no puedas hacerlo con las funciones reales, pero esto es mucho mejor que tener que agregar un combo de enlace / redireccionamiento solo para tener un enlace.
El Yobo
2
Esta respuesta en particular me ayudó con mis elementos de menú de estado de publicación del complemento (probablemente puedas adivinar lo que hace). De todos modos, debido a que no sabía qué otros complementos agregarían cosas a qué menús, pensé en agregar que solía array_push()agregar los elementos del menú para evitar chocar con otros complementos.
mrwweb
Funciona de maravilla, además de un punto de bonificación por usar un fragmento tan pequeño.
João
2
+1. En lugar de elegir una clave y esperar, simplemente tome la última clave e incremente. Por ejemplo, al agregar un elemento de submenú al menú Herramientas: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = etc.
webaware
3

He logrado lo mismo con esto:

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 );

Lo que haces aquí es agregar un elemento de menú y definir slug, luego en 'admin_init' verifica si existe slug y redirige a la ubicación deseada.

Bobz
fuente