web-dev-qa-db-fra.com

Comment ajouter une page d'administrateur WordPress sans l'ajouter au menu?

Je construis un plugin WordPress et j'aimerais avoir une page d'édition qui ne puisse pas être atteinte via le sous-menu (car, dans ce cas, l'élément ne serait pas spécifié).

Cette ressource ( http://codex.wordpress.org/Adding_Administration_Menus ) montre comment associer une page d'administration à une fonction, mais pas comment le faire sans l'ajouter en tant qu'élément de menu.

Cela peut-il être fait?

Merci!

53
Nicky Hajal

Oui, cela peut être fait (techniquement, ce serait plutôt comme enregistrer tout et ensuite supprimer l'élément de menu plus tard), mais il serait plus facile (je pense) de vérifier les paramètres dans le super-global $_GET indique que l'utilisateur souhaite modifier un élément spécifique. 

Par exemple, vous pouvez avoir une page qui répertorie les éléments à modifier et cliquer sur "modifier" ajoute uniquement l'ID de l'élément à l'URL actuelle (chaîne de requête). 

Dans la fonction qui affiche cette page, si ID est défini, donnez-leur la page pour modifier cet élément. 

Sinon, donnez-leur la vue liste. C'est ainsi que les publications, les pages et les autres types de publication personnalisés le font.

16
John P Bloch

La meilleure solution ici http://wordpress.org/support/topic/add-backend-page-without-menu-item

utiliser add_submenu_page avec le slug parent = null

62
Christof Coetzee

add_submenu_page avec le parent slug = null

OR

add_submenu_page avec titre de menu = null

9
Developer-Sid

Remarque: cette solution ne définit pas automatiquement le menu et l'élément de sous-menu actuels. Si vous souhaitez mettre en surbrillance un menu particulier comme étant actuel lors du visionnage de la page masquée, voir mon autre réponse .

D'après les réponses qui me sont présentées, vous pouvez constater qu'il existe de nombreuses façons de procéder. Cependant, il existe une autre solution qui, à mon avis, pourrait être la meilleure.

Charger la page différemment en fonction de la valeur d'une $_GET requête var est une option, mais il se peut que ce ne soit pas ce que certaines personnes recherchent.

Les suggestions concernant add_submenu_page() sont sur la bonne voie, mais chacune des suggestions précédentes pose problème. Régler $menu_title sur null ne empêche pas l’élément de menu de s’afficher, cela permet simplement au lien de ne pas avoir de texte. Le lien prend encore de la place dans le menu, donc ça a l'air drôle. Définir le $parent_slug sur null n'a pas ce problème, mais j'ai remarqué que la page HTML title de la page n'affiche pas le texte $page_title.

Ma solution a été de définir $parent_slug sur un faux slug de menu, tel que 'i_dont_exist'. L'élément de menu ne sera pas affiché et, lors de l'affichage de l'écran d'administration, le titre de la page sera correctement rempli.

add_submenu_page(
    '_doesnt_exist'
    ,__( 'Page title', 'textdomain' )
    ,''
    ,'manage_options'
    ,'menu_slug'
    ,'display_my_menu'
);
5
J.D.

J'ai enfin découvert un moyen de faire cela qui n'est pas un hack laid, qui ne nécessite pas que JS mette en surbrillance l'élément de menu souhaité (et l'élément de sous-menu) et qui fonctionne pour les menus standard enregistrés par des plugins ( @ réponse de Josh ne fonctionne que pour les types de publication personnalisés). 

Pour l'essentiel, il vous suffit d'enregistrer votre sous-menu normalement, puis de vous connecter au filtre 'submenu_file' pour le désenregistrer et, éventuellement, de définir un autre élément de sous-menu à mettre en surbrillance.

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' );
5
J.D.

Oui. Il est très possible de rendre une page inaccessible via le sous-menu, voire le menu principal du panneau d'administration WP Voir l'extrait de code ci-dessous.

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');

J'espère que cela aidera.

4
Jaime Gris

utiliser ce code pour créer une nouvelle page sans ajouter de menu

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";
}
4
Boopathi Rajan

Créez la page de sous-menu et le slug parent laissez-le vide comme ceci:

// 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' )
        );
    }

Vous pouvez y accéder comme ceci:

<a href="/wp-admin/admin.php?page=create-user">Add New</a>
1

J'ai essayé toutes les suggestions ici, mais avec diverses questions associées à chacune.

Le codex WordPress pour add_submenu_page donne maintenant la réponse correcte, qui consiste à utiliser options.php en tant que slug parent. J'ai essayé l'astuce consistant à utiliser un nom composé, mais cela donne des erreurs d'autorisations. De même, l'utilisation de null à différents endroits provoque soit simplement l'absence du texte du menu (mais toujours un clic), soit le nom du navigateur. 

Utiliser options.php a fonctionné et je n’ai rencontré aucun problème en raison de son utilisation.

1
ArtissTheGeek

L'utilisation de add_submenu_page avec un parent de NULL fonctionne définitivement. Toutefois, si vous souhaitez conserver la page non liée associée à un menu particulier (par exemple un menu de type publication personnalisée), vous devez utiliser une variante de la réponse 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');

Il semble que les deux actions s'annulent, cependant remove_submenu_page ne désenregistre pas la fonction de rappel; cela supprime simplement le lien.

Ainsi, lorsque quelqu'un visualise votre page non liée, le menu de navigation approprié (notre menu de type de publication personnalisé dans cet exemple) s'affiche toujours comme étant actif.

1
Josh

L’un des problèmes que j’ai simplement trouvé en ajoutant null comme slug parent pour un élément de sous-menu est que si vous affichez cette page spécifique, le sous-menu lui-même ne s’affiche pas titre de la page ne s'affiche pas).

Ce que j'ai fait a été d'ajouter un élément span vide dans le titre du menu et d'utiliser jquery pour parcourir les éléments parents et les masquer.

0
Dustin Blake