web-dev-qa-db-fra.com

Ajouter une page d'administrateur, mais ne l'affichez pas dans le menu d'administrateur

J'ai un plugin personnalisé 'Charts' qui a son propre menu. Ce menu contient des liens vers les 3 pages du plugin - "Graphiques", "Ajouter un graphique" et "Modifier le graphique". Cependant, je ne souhaite pas afficher le lien vers "Modifier le graphique".

Voici comment j'ajoute la page en question -

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

J'ai parcouru Internet et je ne trouve pas le moyen de le faire (ça marche). Il est possible de supprimer tous les menus de niveau supérieur (pas ce dont j'ai besoin), et vous pouvez supprimer des entrées individuelles du $submenu global (mais cela supprime également la capacité enregistrée), afin que personne ne puisse accéder à la page -

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

            /** Removes all permissions to access the page */
            //unset($submenu['charts'][$key]);              
            /** Removes the title, but the menu entry still exists, so it looks odd */
            $submenu['charts'][$key][0] = '';

        endif;
    endforeach;
endif;

J'ai cherché à le cacher via CSS, mais je ne vois pas comment le faire grâce au code HTML généré par Wordpress -

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

J'ai aussi envisagé jQuery, mais cela a des limitations similaires à la route CSS, en plus de croire que je suis le seul à avoir jamais voulu faire cela - il doit y avoir un moyen, je ne peux pas le trouver!

Tous les conseils et astuces appréciés.

Merci.

7
David Gard

Utilisez une page de sous-menu comme slug parent. Le menu admin a seulement deux niveaux, donc le troisième niveau imaginaire sera caché.

Exemple de code, testé:

add_action( 'admin_menu', 'wpse_73622_register_hidden_page' );

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

function wpse_73622_render_hidden_page()
{
    echo '<p>hello world</p>';
}
8
fuxia

Dans les documents de add_submenu_page() , vous voyez que vous pouvez masquer votre lien de sous-menu depuis un élément de menu de niveau supérieur auquel il appartient, définissant la valeur slug (1er argument) sur null:

add_action( 'admin_menu', 'register_my_custom_submenu_page' );

function register_my_custom_submenu_page() {
    add_submenu_page( 
        null,
        'My Custom Submenu Page',
        'My Custom Submenu Page',
        'manage_options',
        'my-custom-submenu-page',
        'my_custom_submenu_page_callback',
    );
}

Pour mettre en surbrillance l'élément de menu souhaité (par exemple, "tous les graphiques" lors de l'accès à la page masquée "Modifier le graphique"), procédez comme suit:

add_filter( 'submenu_file', function($submenu_file){
    $screen = get_current_screen();
    if($screen->id === 'id-of-page-to-hide'){
        $submenu_file = 'id-of-page-to-higlight';
    }
    return $submenu_file;
});
22
lanicor