« Vous n’avez pas l’autorisation d’accéder à cette page. » C’est le message qu’un utilisateur ne devrait jamais avoir besoin de voir, parce que le menu correspondant ne devrait tout simplement pas apparaître dans son tableau de bord. Le cas se présente régulièrement avec un intervenant ponctuel : un consultant SEO externe, une agence de traduction, un partenaire technique qui n’a besoin d’accéder qu’à un seul écran précis, mais qui reçoit malgré tout un compte administrateur complet faute de rôle plus fin déjà configuré.
Créer un rôle entièrement sur mesure avec ses propres capacités est parfois justifié, mais devient disproportionné pour un accès ponctuel et limité dans le temps. Une alternative plus légère consiste à conserver le rôle existant (souvent éditeur ou administrateur restreint) et à masquer chirurgicalement les menus et écrans sensibles pour les comptes identifiés comme externes, via un simple indicateur sur l’utilisateur.
Identifier le compte partenaire de façon stable
Le critère de repérage doit rester simple à maintenir : une meta utilisateur dédiée, positionnée à la création du compte, plutôt qu’une liste d’e-mails codée en dur qui devient vite obsolète.
// À la création ou à l'édition du profil utilisateur
update_user_meta( $user_id, '_est_compte_partenaire', 1 );
Un champ dans l’écran de profil utilisateur, ajouté via show_user_profile et edit_user_profile, permet à un administrateur de cocher cette case sans intervention en base de données.
Retirer les menus sensibles au chargement de l’admin
Le hook admin_menu, exécuté après l’enregistrement de tous les menus natifs et d’extensions, est le point d’entrée classique pour retirer des entrées via remove_menu_page() et remove_submenu_page().

add_action( 'admin_menu', function () {
$utilisateur = wp_get_current_user();
if ( ! get_user_meta( $utilisateur->ID, '_est_compte_partenaire', true ) ) {
return;
}
remove_menu_page( 'tools.php' );
remove_menu_page( 'users.php' );
remove_menu_page( 'plugins.php' );
remove_submenu_page( 'options-general.php', 'options-permalink.php' );
}, 999 );
La priorité élevée (999) garantit que ce filtre s’exécute après les extensions qui ajoutent leurs propres menus, sinon certains sous-menus tiers échapperaient au nettoyage.
Bloquer aussi l’accès direct à l’URL de l’écran
Retirer un menu ne bloque que l’affichage du lien : un utilisateur connaissant l’URL exacte de l’écran (/wp-admin/plugins.php, par exemple) peut toujours y accéder directement en la tapant dans le navigateur. Le hook current_screen permet d’intercepter cette tentative et de rediriger.
add_action( 'current_screen', function ( $screen ) {
$utilisateur = wp_get_current_user();
if ( ! get_user_meta( $utilisateur->ID, '_est_compte_partenaire', true ) ) {
return;
}
$ecrans_interdits = array( 'plugins', 'users', 'tools', 'options-general' );
if ( in_array( $screen->id, $ecrans_interdits, true ) ) {
wp_die(
esc_html__( 'Cet écran n\'est pas accessible à votre type de compte.', 'wpmoderne' ),
'',
array( 'response' => 403, 'back_link' => true )
);
}
} );
Adapter la barre d’administration également
La barre noire en haut de l’écran propose souvent des raccourcis vers les mêmes écrans retirés du menu latéral. Le hook admin_bar_menu, avec une priorité tardive, permet de retirer les nœuds correspondants (updates, comments, ou tout nœud personnalisé ajouté par une extension).
- Lister les identifiants de nœuds via
$wp_admin_bar->get_nodes()en environnement de test avant d’écrire lesremove_node()définitifs. - Vérifier après chaque mise à jour majeure de WordPress qu’aucun nouveau nœud natif n’est apparu sans être couvert par la règle de masquage.
Prévoir la fin de la mission du partenaire
Un compte partenaire reste souvent actif plus longtemps que prévu. Ajouter une date d’expiration en meta utilisateur, vérifiée à chaque connexion, désactive automatiquement le compte plutôt que de compter sur une désactivation manuelle qui finit par être oubliée.
Un accès temporaire qui n’a pas de date de fin programmée devient, dans les faits, un accès permanent : la désactivation manuelle est toujours la première étape qu’on oublie.
En résumé
Masquer un menu ne suffit jamais seul : l’accès direct à l’écran et les raccourcis de la barre d’administration doivent être couverts par la même logique, sinon la restriction reste cosmétique. Cette approche légère, basée sur une simple meta utilisateur et deux hooks, évite de construire un rôle complexe pour un besoin ponctuel et reste facile à retirer une fois la mission du partenaire terminée.