¿Cómo agregar una página de administración de WordPress sin agregarla al menú?


Estoy construyendo un plugin de WordPress y me gustaría tener una página de edición de elementos a la que no se pueda acceder a través del submenú (porque entonces el elemento no se especificaría).

Este recurso ( http://codex.wordpress.org/Adding_Administration_Menus ) muestra cómo asociar una página de administración con una función, pero no cómo hacerlo sin agregarla como un elemento de menú.

Se Puede hacer esto?

Gracias!

 51
Author: jpaugh, 2010-10-11

12 answers

Sí, esto se puede hacer (bueno, técnicamente, sería más como registrar todo y luego eliminar el elemento del menú más tarde), pero sería más fácil (creo) verificar los parámetros en el superglobal $_GET para indicar que el usuario desea editar un elemento específico.

Por ejemplo, podría tener una página que enumera elementos para editar, y hacer clic en 'editar' solo agrega el ID del elemento a la URL actual(query-string).

En la función que muestra esta página, si ID es definido, darles la página para editar ese elemento.

De lo contrario, déles la vista de lista. Así es como lo hacen las publicaciones, las páginas y otros tipos de publicaciones personalizadas.

 14
Author: John P Bloch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-06 09:31:04

La mejor solución aquí http://wordpress.org/support/topic/add-backend-page-without-menu-item

Use add_submenu_page con slug principal = null

 62
Author: Christof Coetzee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-14 01:51:06

Add_submenu_page with parent slug = null

O

Add_submenu_page with menu title = null

 9
Author: Developer-Sid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-06 09:16:19

Nota: Esta solución no establece automáticamente el menú y el submenú actuales. Si desea resaltar un menú en particular como actual cuando se ve la página oculta, consulte mi otra respuesta.

De las respuestas que vienen ante mí, puedes ver que hay muchas maneras de hacer esto. Sin embargo, hay otra forma que creo que puede ser la mejor.

Cargar la página de manera diferente en función del valor de una variable de consulta $_GET es una opción, pero puede no ser lo que algunas personas están buscando.

Las sugerencias con respecto a add_submenu_page() están en el camino correcto, pero cada una de las sugerencias anteriores tiene problemas. Establecer $menu_title a null no impide que el elemento de menú se muestre, solo hace que el enlace no tenga texto. Sin embargo, el enlace todavía ocupa algo de espacio en el menú, por lo que se ve divertido. Establecer $parent_slug a null no tiene este problema, pero noté que el HTML title de la página no muestra el texto $page_title.

Mi la solución fue establecer $parent_slug a un slug de menú falso, como 'i_dont_exist'. El elemento de menú no se mostrará, y al ver la pantalla de administración, el título de la página se completará correctamente.

add_submenu_page(
    '_doesnt_exist'
    ,__( 'Page title', 'textdomain' )
    ,''
    ,'manage_options'
    ,'menu_slug'
    ,'display_my_menu'
);
 5
Author: J.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 15:58:47

Sí. Es muy posible hacer que una página no pueda ser alcanzada a través del submenú, o incluso el menú principal en el panel de administración de WP. Vea el fragmento de código a continuación.

function myplugin_render_edit_page() {
    // Code contains the UI for edit page.
}

/**
 * Manage menu items and pages.
 */
function myplugin_register_admin_page() {
    global $_registered_pages;

    $menu_slug = plugin_basename('myplugin.php');
    $hookname = get_plugin_page_hookname($menu_slug,'');
    if (!empty($hookname)) {
        add_action($hookname, 'myplugin_render_edit_page');
    }
    $_registered_pages[$hookname] = true;
}
add_action('admin_menu', 'myplugin_register_admin_page');

Con suerte, esto ayudará.

 4
Author: Jaime Gris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-14 21:44:33

Use este código para crear una nueva página sin agregar en el menú

add_action( 'admin_menu', 'register_newpage' );

function register_newpage(){
    add_menu_page($appname, $appname, 'administrator','custompage', 'custom');
    remove_menu_page('custom');
}

function custom()
{
echo "hai";
}
 3
Author: Boopathi Rajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 10:44:36

Finalmente he descubierto una forma de hacer esto que no es un truco feo, no requiere que JS resalte el elemento de menú deseado (y el elemento de submenú), y funciona para menús regulares registrados por complementos (@Josh respuesta solo funciona para tipos de correos personalizados).

Esencialmente, solo necesita registrar su submenú normalmente, pero luego engancharlo al filtro 'submenu_file' para cancelarlo y opcionalmente también establecer otro elemento de submenú para resaltar en su lugar.

function so3902760_wp_admin_menu() {

    // Register the parent menu.
    add_menu_page(
        __( 'Parent title', 'textdomain' )
        , __( 'Parent', 'textdomain' )
        , 'manage_options'
        , 'my_parent_slug'
        , 'display_my_menu'
    );

    // Register the hidden submenu.
    add_submenu_page(
        'my_parent_slug' // Use the parent slug as usual.
        , __( 'Page title', 'textdomain' )
        , ''
        , 'manage_options'
        , 'my_hidden_submenu'
        , 'display_my_submenu'
    );
}
add_action( 'admin_menu', 'so3902760_wp_admin_menu' );

function so3902760_wp_admin_submenu_filter( $submenu_file ) {

    global $plugin_page;

    $hidden_submenus = array(
        'my_hidden_submenu' => true,
    );

    // Select another submenu item to highlight (optional).
    if ( $plugin_page && isset( $hidden_submenus[ $plugin_page ] ) ) {
        $submenu_file = 'submenu_to_highlight';
    }

    // Hide the submenu.
    foreach ( $hidden_submenus as $submenu => $unused ) {
        remove_submenu_page( 'my_parent_slug', $submenu );
    }

    return $submenu_file;
}
add_filter( 'submenu_file', 'so3902760_wp_admin_submenu_filter' );
 2
Author: J.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 15:54:28

He probado todas las sugerencias aquí, pero con varios problemas asociados con cada uno.

El codex de WordPress para add_submenu_page ahora da la respuesta correcta, que es usar opciones.php como su babosa padre. Intenté el truco de usar un nombre inventado, pero eso da errores de permisos, igualmente el uso de null en varias ubicaciones hace que el texto del menú simplemente falte (pero aún se puede hacer clic) o que el título del navegador desaparezca.

Usando opciones.php funcionó y no he visto ningún problema como resultado de su uso.

 1
Author: ArtissTheGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 13:12:50

El uso de add_submenu_page con un padre de NULL definitivamente funciona, sin embargo, si desea mantener la página no vinculada asociada con un menú en particular (digamos un menú de tipo post personalizado), debe usar una variación de la respuesta de @Boopathi:

function my_hidden_submenu_page(){
    //add the submenu page the usual way
    add_submenu_page('edit.php?post_type=custom-type', 'My Page Title', 'My Page Title', 'manage_options', 'my-page-slug', 'my_page_callback');
    //then remove it
    remove_submenu_page('edit.php?post_type=custom-type','my-page-slug');
}
add_action('admin_menu', 'my_hidden_submenu_page');

Parece que las dos acciones se cancelarían entre sí, sin embargo remove_submenu_page no anula el registro de la función callback; simplemente elimina el enlace.

De esta manera, cuando alguien está viendo su página no vinculada, la el menú de navegación correcto (nuestro menú de tipo de mensaje personalizado en este ejemplo) seguirá mostrándose como activo.

 1
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-16 03:35:48

Crear página de submenú y slug padre dejarlo vacío de esta manera:

// Create page were you can add new users.
    public function add_create_user_menu() {
        add_submenu_page(
            '',
            'Create User',
            'Create User',
            'manage_options',
            'create-user',
            array( $this, 'add_create_user_page' )
        );
    }

Puedes acceder así:

<a href="/wp-admin/admin.php?page=create-user">Add New</a>
 1
Author: Dragi Postolovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-14 09:28:11

Uno de los problemas que encontré con simplemente agregar null como slug principal para un elemento de submenú es que si actualmente estás viendo esa página específica, el submenú en sí no se mostrará (al menos no lo hizo para mí (junto con el título de la página que no se muestra).

Lo que hice fue agregar un elemento span vacío dentro del título del menú y usar jquery para recorrer los elementos padre y ocultarlo.

 0
Author: Dustin Blake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 12:25:08

Encuentro que puedes hacerlo reutilizando el id de inserción, así:

add_menu_page( 'User AS Packages', 'User AS', 'manage_options', 'myplugin/editaspackages.php', 'UserASPackages', '', 8);
add_menu_page( 'User ARP Packages', 'User ARP', 'manage_options', 'myplugin/editarppackages.php', 'UserARPPackages', '', 8);
add_menu_page( 'AS Packages', 'AS Packages', 'manage_options', 'myplugin/ars-s2.php', 'ARPPackages', '', 8);

Los últimos 3 usando la posición 8 y el último anula los dos anteriores para que los dos anteriores no aparezcan.

 -1
Author: Ben Glancy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 17:44:10