it-swarm-es.com

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

¿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 esté trabajando para poder mostrarle al usuario cómo se diseñan los diferentes elementos HTML con el tema y para demostrar 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 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 con header() produce un error ( No se puede modificar la información del encabezado ).

20
Tom

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ú, pero en su lugar "hook" WordPress lo suficientemente temprano como para que no genere nada excepto los encabezados HTTP. El primer enganche al llamar /wp-admin/themes.php parece ser after_setup_theme y parece funcionar bien.

Use una "Barra de menú" Para que pueda probarla en un gancho

Pero para que funcione, primero debemos modificar su llamada a add_theme_page en el 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 (el "barra de menú" ) a 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 su función build_styleguide_page() porque no la necesitamos para esta solución.

Redirigir en el enlace anterior 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 asegurarnos de que se haya pasado un parámetro de URL de goto en la URL. Luego prueba el valor de goto usando una instrucción switch/case para ver si tiene un valor de 'build-styleguide-page'; si es así, redirige a su hipotético declarado, p. ej. De lo contrario, Google simplemente nos redirigirá 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 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!

13
MikeSchinkel

Si agrega su elemento al menú agregándolo directamente a la matriz $submenu, evitará la necesidad de redireccionar 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 Panel de control menú.

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 en el 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 500 arreglos en el código de ejemplo).

CONSEJO: Puede usar valores negativos en las teclas de menú para, por lo tanto, puede forzar que los elementos del menú se sitúen antes que cualquiera de los elementos nativos de WordPress.

21
t31os

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 hace aquí es agregar el elemento de menú y definir el slug, luego en 'admin_init' usted verifica si existe el slug y redirige a la ubicación deseada.

3
Bobz