Agregar una página de administración sin mostrarla en el menú de administración

22 nov 2012, 16:35:50
Vistas: 20.9K
Votos: 10

Tengo un plugin personalizado 'Charts' que tiene su propio menú. En ese menú hay enlaces a las 3 páginas del plugin - 'Charts', 'Add Chart' y 'Edit Chart'. Sin embargo, no quiero mostrar el enlace a 'Edit Chart'.

Así es como agrego la página en cuestión -

$this->pagehook = add_submenu_page('charts', __('Edit Chart'), __('Edit Chart'), 'edit_charts', 'edit-chart', array(&$this, 'on_show_page'));

He buscado por internet y no puedo encontrar una manera de hacer esto (que funcione). Es posible eliminar menús completos de nivel superior (no es lo que necesito), y puedes eliminar entradas individuales del global $submenu (pero hacer eso también elimina la capacidad registrada), por lo que nadie puede acceder a la página -

global $submenu;
if(!empty($submenu['charts'])) : foreach($submenu['charts'] as $key => $page) :
        if($page[0] === 'Edit Chart') :

            /** Elimina todos los permisos para acceder a la página */
            //unset($submenu['charts'][$key]);              
            /** Elimina el título, pero la entrada del menú aún existe, así que se ve extraño */
            $submenu['charts'][$key][0] = '';

        endif;
    endforeach;
endif;

He investigado cómo ocultarlo mediante CSS, pero no veo una manera de hacerlo a través del HTML que WordPress genera -

<li><a href="admin.php?page=edit-chart" tabindex="1">Edit Chart</a></li>

También he considerado jQuery, pero tiene limitaciones similares a la ruta CSS, además me niego a creer que soy el único que ha deseado hacer esto - debe haber una manera, ¡simplemente no puedo encontrarla!

Cualquier consejo y sugerencia será apreciado.

Gracias.

1
Comentarios

¿Dónde estás enganchando esta función? ¿Qué filtro/acción?

s_ha_dum s_ha_dum
22 nov 2012 16:45:19
Todas las respuestas a la pregunta 3
3
32

De la documentación sobre add_submenu_page(), puedes ver que puedes ocultar el enlace de tu submenú de un elemento de menú de nivel superior al que pertenece estableciendo el slug (primer argumento) en null:

add_action( 'admin_menu', 'register_my_custom_submenu_page' );

function register_my_custom_submenu_page() {
    add_submenu_page( 
        null,
        'Mi página de submenú personalizada',
        'Mi página de submenú personalizada',
        'manage_options',
        'my-custom-submenu-page',
        'my_custom_submenu_page_callback',
    );
}

Para resaltar el elemento de menú deseado (por ejemplo, 'todos los gráficos' al acceder a la página oculta 'editar gráfico'), puedes hacer lo siguiente:

add_filter( 'submenu_file', function($submenu_file){
    $screen = get_current_screen();
    if($screen->id === 'id-de-la-pagina-a-ocultar'){
        $submenu_file = 'id-de-la-pagina-a-resaltar';
    }
    return $submenu_file;
});
19 sept 2015 15:32:20
Comentarios

Genial, pero el resaltado no funciona correctamente. Si configuro submenu_file se muestran como actuales. Pero el menú de nivel superior no se abre. Pero si configuro parent_file, WordPress ejecuta la función get_admin_page_parent() después de los filtros y lo cambia de vuelta. ¿Para qué los desarrolladores de WordPress agregaron el filtro parent_file si de todos modos la función lo cambia de vuelta? ¿Podrías ayudar?

DARK_DIESEL DARK_DIESEL
28 ago 2018 16:11:17

Además, si parent_slug se establece como null, page_title no se usa en el título.

DARK_DIESEL DARK_DIESEL
28 ago 2018 16:12:10

Puedes usar 'options.php' en lugar de null.

RavanH RavanH
20 mar 2019 01:58:01
1
12

Usa una página de submenú como slug padre. El menú de administración solo tiene dos niveles, por lo que el tercer nivel imaginario quedará oculto.

Código de ejemplo, probado:

add_action( 'admin_menu', 'wpse_73622_register_hidden_page' );

function wpse_73622_register_hidden_page()
{
    add_submenu_page(
        'options-writing.php',
        '¡Oculto!',
        '¡Oculto!',
        'exists',
        'wpse_73622',
        'wpse_73622_render_hidden_page'
    );
    # /wp-admin/admin.php?page=wpse_73622
}

function wpse_73622_render_hidden_page()
{
    echo '<p>hola mundo</p>';
}
22 nov 2012 16:56:05
Comentarios

Esto funciona, aunque lo que no funciona es que el estado activo en el elemento padre del menú se pierde, por lo que el submenú se cierra y ningún elemento padre del menú queda seleccionado en la barra lateral izquierda.

Lee Lee
1 ago 2016 12:50:30
0

Podrías usar CSS y podrás acceder a él a través de la URL en la etiqueta href:

#adminmenu a[href="admin.php?page=edit-chart"] { 
    display: none;
}

No hay rellenos o espacios adicionales para el elemento LI padre, por lo que no necesitas ocultarlo. También seguirás pudiendo acceder al submenú.

31 mar 2021 16:25:50