¿Agregando un enlace arbitrario al menú de administración?

20

¿Hay alguna forma 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 para mostrar cómo estilizar varias cosas. .

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

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 con header() produce un error ( No se puede modificar la información del encabezado ).

    
pregunta Tom 30.08.2010 - 19:39

3 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 necesita aprender cómo hacer que su enlace redirija correctamente, ¿verdad?

Redireccionamiento a una URL externa desde un elemento del menú de administración

Si es así, lo que debe hacer es no usar la función del elemento del menú, sino "enganchar" WordPress con la suficiente antelación para que no genere nada, excepto posiblemente los encabezados HTTP. El primer enlace cuando se llama a /wp-admin/themes.php parece ser after_setup_theme y parece funcionar bien.

Usa una "Barra de menú" para que puedas probarla en un gancho

Pero para que funcione, primero debemos modificar su llamada a add_theme_page en la función admin_menu hook / your create_theme_style_page() . Eliminamos el quinto parámetro (la función a la que llamar para implementar la opción de administrador) porque no lo necesitamos, y cambiamos el cuarto parámetro (la "barra 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 el enrutamiento a la misma página ( themes.php ) como otras opciones de apariencia para mantener la coherencia. También se me ocurrió arbitrariamente el nombre goto porque WordPress no lo usa y parece que tiene 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 la función build_styleguide_page() porque no la necesitamos para esta solución.

Redirecciona en el primer enlace para themes.php : after_setup_theme

Como nuestro último bit de código implementamos nuestro gancho after_setup_theme en nuestra función redirect_from_admin_menu() . Lo tenemos probado para ver si la página actual es themes.php y para asegurar que se haya pasado un parámetro de URL de goto en la URL. Luego prueba el valor de goto usando una declaración switch / case para ver si tiene un valor de 'build-styleguide-page' ; si es así, se redirige a su hipotética declarada, p. ej. De lo contrario, Google simplemente nos redirecciona 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 / case en la función after_setup_theme hook / redirect_from_admin_menu() para que sea más fácil agregar redirecciones adicionales de goto si es necesario; sólo tiene que añadir 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!

    
respondido por el MikeSchinkel 30.08.2010 - 20:46
21

Si agrega su elemento al menú agregándolo directamente a la matriz $submenu , evitará la necesidad de redirigir 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.php representa la clave / enlace del menú principal, por lo que en el ejemplo básicamente estoy agregando un elemento al menú Panel ..

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

Uso algo similar para agregar mis diversos hosts virtuales al menú, así 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 utilizar 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).

CONSEJO: Puedes usar valores negativos en las teclas de menú para forzar a que los elementos del menú se sitúen antes que cualquiera de los elementos nativos de WordPress.

    
respondido por el t31os 09.11.2010 - 18:14
2

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' verificas si existe slug y redirigir a la ubicación deseada.

    
respondido por el Bobz 21.01.2015 - 22:15

Lea otras preguntas en las etiquetas