¿Añadir menú y submenú en el admin con una URL en lugar de slug?

30 ene 2013, 15:06:10
Vistas: 24K
Votos: 6

Uso esta función y hook:

function mysite_admin_menu() 
{
  add_menu_page( 'Categories', 'Categorías', 'administrator', 'categories', 'a_function' );
  add_submenu_page( 'categories', 'Manage', 'Gestionar', 'administrator', 'xxx', 'a_function' );
  remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );

Muestra lo que necesito: un menú con un submenú en la barra de menú del administrador.

El problema es que el submenú lleva a esta página: admin.php?page=xxx.

¿Cómo puedo hacer para enlazar a una URL como edit-tags.php?taxonomy=category?

Si cambio el slug en el add_submenu_page por una URL relativa, el enlace llevará a admin.php?page=edit-tags.php?taxonomy=category.

Haga lo que haga, siempre obtengo admin.php?page=... que no es lo que quiero.

1
Comentarios

mira el ejemplo actualizado =)

Oleg Butuzov Oleg Butuzov
31 ene 2013 08:02:45
Todas las respuestas a la pregunta 5
0
13

Esta es una publicación antigua, pero ¿no podrías simplemente usar las variables globales de WordPress $menu y/o $submenu como sugirió Oleg en el punto número 2?

Cuando tengas dudas, copia a WordPress:

wordpress/wp-admin/menu.php

Por ejemplo, para añadir un enlace, esto parece que funcionaría:

function add_external_link_admin_submenu() {
    global $submenu;
    $permalink = admin_url( 'edit-tags.php' ).'?taxonomy=category';
    $submenu['options-general.php'][] = array( 'Manage', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');

Puedes reemplazar el $permalink = ... con cualquier cosa

Así que esto también debería funcionar:

$permalink = 'http://www.example.com';

Además, se sugiere no usar 'administrator' (aunque yo también lo uso). En cualquier caso, lee este ticket para ver soluciones alternativas.

26 jun 2014 08:22:56
0

No te recomiendo que hagas eso.

Supongamos que tu prefijo para admin.php es _trigger_me_

  1. Submenú

    <?php
    
    function _clean_url_to_repalce_admin_menu($url, $original_url, $_context){
        if ($url == 'admin.php?page=_trigger_me_'){
            remove_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10);
            //return admin_url('someotherpage.php);
            return 'http://google.com/';
        }
    }
    if (is_admin())
    add_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10, 3);
    
  2. Menú Principal

    <?php
    function custom_admin_menu_action_hook(){
        global $menu;
        foreach($menu as $k=>$item){
            if ($item[2] == '_trigger_me_'){
                    $menu[$k][2] = 'http://google.com';
            }
        }
    }
    add_action('admin_menu', 'custom_admin_menu_action_hook', 100);
    

Llamo a ambos ejemplos como "hacks". Son posibles de hacer, pero mejor no hacerlos.

Actualización.

En caso de que estés satisfecho con la redirección =)

<?php
$hook = add_submenu_page($parent, $title, $menu_title, 'manage_option', 'callback');
add_action("load-{$hook}", create_function('','
    header("Location:", admin_url("someurl.php?blahblahblah"));
    exit;
'));

En caso de que quieras sustituir esto por la página de taxonomía (edit-tags.php)

<?php
add_action('admin_menu', 'admin_menu_edit_tags_page');
function admin_menu_edit_tags_page(){
    // por favor establece $YOURPARENTSLUG como el slug padre de tu elemento de menú (padre de tu menú)
    // manage_tags a manage_terms de la capacidad de tu taxonomía (se ve cuando haces var_dump($wp_taxonomies[$taxonomyyouwant]));
    add_submenu_page($YOURPARENTSLUG, 'menu', 'title', 'manage_tags',  'edit-tags.php?taxonomy=taxonomy');
}
30 ene 2013 16:06:07
0

Si tu submenú carece del prefijo admin.php?page=, primero debes registrar el menú padre y luego el submenú.

add_action( 'admin_menu', function() {

// Primero el menú padre
add_menu_page( 'Título de la página', 'Título del Menú', 'capacidad', 'slug-padre', 'callback' );

// Luego los submenús
add_submenu_page( 'slug-padre', 'Título del Submenú', 'Título del Submenú', 'capacidad', 'slug', 'callback' );

} );

De lo contrario, el enlace será solamente el slug.

18 jul 2020 22:29:47
0

Gracias Oleg, tu script funciona pero rompe la interfaz de administración (los colores de fondo e imágenes desaparecen por alguna razón).

Pero si tengo que seguir este camino, puedo hacer esto en su lugar:

function changeUrl()
{
    $pageURL = 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];

    if ($pageURL == 'http://www.misitio.com/wp-admin/admin.php?page=xxxx')
    {
        header ('location:http://www.misitio.com/wp-admin/edit-tags.php?taxonomy=category');
    }
}
add_action( 'admin_menu', 'changeUrl' );

Me parece curioso que no haya una forma sencilla de enlazar un submenú a cualquier URL. Este tipo de redirección es desordenado... pero funciona.

31 ene 2013 01:55:40
0

Aunque este es un problema antiguo, me gustaría contribuir con este código para su consideración:

function mysite_admin_menu() 
{
  add_menu_page( 'Categorías', 'Categorías', 'administrator', 'categories', 'a_function' );
  add_submenu_page( 'categories', 'Administrar', 'Administrar', 'administrator', 'manage_categories', 'mysite_manage_categories' );
  remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );

function mysite_manage_categories() 
{ 

?><script>window.location = "<?php echo admin_url('edit-tags.php?taxonomy=category'); ?>";</script><?php 
    }

Utiliza una redirección con JavaScript en lugar de crear otro add_action para redirigir mediante HTTP.

25 feb 2016 01:45:56