Añadir un enlace arbitrario al menú de administración
¿Existe alguna forma de añadir un hipervínculo arbitrario al menú de administración de WordPress (me refiero al menú de la izquierda cuando inicias sesión en el panel de control)? Por ejemplo, ¿se puede añadir un enlace a Google?
En mi caso particular, me gustaría añadir una página de guía de estilos para un tema de WordPress en el que estoy trabajando, para mostrar al usuario cómo se estilizan los diferentes elementos HTML con el tema y demostrar cómo estilizar varios elementos correctamente.
Este es el código que tengo hasta ahora (nota: está incompleto): En functions.php he añadido 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('Guía de Estilos del Tema', 'Guía de Estilos', 'administrator', basename(__FILE__), 'build_styleguide_page');
}
function build_styleguide_page() {
echo "¿No estoy seguro de qué poner aquí para redirigir al administrador a una URL arbitraria?";
}
En build_styleguide_page()
, al intentar redirigir con header()
se produce un error (No se puede modificar la información de la cabecera).

Si agregas tu elemento al menú añadiéndolo directamente al array $submenu
evitarás la necesidad de hacer una redirección y podrás usar una URL externa completa como enlace del menú (yo mismo hago esto).
add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
global $submenu;
$submenu['index.php'][500] = array( 'Nombre del elemento del menú', 'manage_options' , 'http://example.com' );
}
index.php
representa la clave/enlace del menú padre, así que en el ejemplo básicamente estoy añadiendo un elemento al menú Escritorio...
Claro, no es tan elegante como usar las funciones add_{type}_page
, pero evita el hecho de que WordPress impide usar URLs externas en los enlaces del menú de administración...
Yo uso algo similar para añadir mis distintos hosts virtuales al menú, así puedo cambiar a otras instalaciones directamente desde el menú de administración (todo hecho con un script, pero básicamente usa una versión mejorada del código anterior).
NOTA: Si decides usar este código, ten cuidado de no asignar una clave que ya esté en uso (la clave 500 del array en el código de ejemplo).
CONSEJO: Puedes usar valores negativos en las claves del menú también, así puedes forzar a que tus elementos del menú aparezcan antes que los elementos nativos de WordPress.

NOTA: Creo que necesitarás establecer esa clave negativa como una cadena, es decir, '-5'
y no -5
, de lo contrario la clave se considera inválida (creo).. (las cadenas negativas sí funcionan, si no me equivoco)..

Gracias, es una pena que no se pueda hacer con las funciones reales, pero esto es mucho mejor que tener que añadir un combo de hook/redirect solo para tener un enlace.

Esta respuesta en particular me ayudó con mi plugin Post Status Menu Items (puedes adivinar lo que hace). De todos modos, como no sabía qué otros plugins podrían estar añadiendo cosas a qué menús, pensé en agregar que usé array_push()
para añadir los elementos del menú y evitar colisiones con otros plugins.

Funciona perfectamente, además un punto extra por usar un fragmento de código tan pequeño.

+1. En lugar de elegir una clave y esperar, simplemente toma la última clave e increméntala. 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.

Muchas gracias :) Intenté usar tanto Jquery como redirección y tuve problemas. Esto es perfecto.

Tengo una pregunta, ¿cómo agregaría otro enlace? Intenté usar un array multidimensional, pero no está permitido.

Evité deliberadamente el enfoque de incremento porque no siempre puedo decir que quiero añadir o anteponer el índice, ni la pregunta tenía ese requisito, pero sería una opción inteligente si quisieras añadir elementos al menú de forma programática.

Para abrir el enlace en una nueva pestaña / nueva página (target="_blank"), lee esto: https://stackoverflow.com/questions/23036664/how-to-open-target-blank-in-a-custom-admin-sub-menu-page

Hola @Tom,
Si entiendo correctamente tu pregunta, no necesitas tanto saber cómo agregar un enlace al menú (parece que ya lo sabes) sino más bien aprender cómo hacer que tu enlace redireccione correctamente, ¿verdad?
Redireccionar a una URL externa desde un ítem del menú de administración
En ese caso, lo que debes hacer es no usar la función del ítem de menú sino en su lugar "enganchar" WordPress lo suficientemente temprano como para que no haya generado ninguna salida excepto posiblemente cabeceras HTTP. El hook más temprano al llamar a /wp-admin/themes.php
parece ser after_setup_theme
y funciona bien.
Usar un "Menu Slug" para poder probarlo en un hook
Pero para que funcione, primero necesitamos modificar tu llamada a add_theme_page
en el hook admin_menu
/ tu función create_theme_style_page()
. Eliminamos el quinto parámetro (la función a llamar para implementar la opción de admin) porque no lo necesitamos, y cambiamos el cuarto parámetro (el "menu slug") a themes.php?goto=build-styleguide-page
.
Aunque podríamos haber elegido casi cualquier cosa para el cuarto parámetro, dado que vamos a redirigir, lo enruté a la misma página (themes.php
) que otras opciones de apariencia por consistencia. También arbitrariamente usé el nombre goto
porque 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(
'Guía de estilos del tema',
'Guía de estilos del tema',
'administrator',
'themes.php?goto=build-styleguide-page'
);
}
Por cierto, eliminamos tu función build_styleguide_page()
porque no la necesitamos para esta solución.
Redireccionar en el hook más temprano para themes.php
: after_setup_theme
Como último fragmento de código, implementamos nuestro hook after_setup_theme
en nuestra función redirect_from_admin_menu()
. Hacemos que verifique si la página actual es themes.php
y que se asegure de que se pasó un parámetro URL de goto
. Luego prueba el valor de goto
usando una sentencia switch
/case
para ver si tiene un valor de 'build-styleguide-page'
; si es así, redirige a tu ejemplo hipotético, por ejemplo Google, de lo contrario simplemente redirigimos de vuelta al escritorio 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:
Elegí usar la sentencia
switch
/case
en el hookafter_setup_theme
/ funciónredirect_from_admin_menu()
para que sea más fácil agregar más redireccionesgoto
si lo necesitas; solo agrega más sentencias case.Las funciones
wp_redirect()
ywp_safe_redirect()
no terminan realmente; necesitas emitir explícitamente una sentencia exit para que WordPress se detenga y no anule tu redirección.
¡Espero que esto ayude!

He logrado lo mismo con esto:
function add_custom_menu_item(){
add_menu_page( 'Título del Elemento del Menú', 'Título de la Página', 'manage_options', 'slug_de_la_pagina', 'funcion', 'dashicons-icono', 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 == 'slug_de_la_pagina' ) {
wp_safe_redirect( home_url('/mi-pagina') );
exit();
}
}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );
Lo que haces aquí es agregar un elemento al menú y definir un slug, luego en 'admin_init' verificas si el slug existe y rediriges a tu ubicación deseada.
