web-dev-qa-db-fra.com

Comment afficher un élément de barre d'administration uniquement?

J'essaie d'ajouter des éléments à la barre d'administration, mais uniquement pour les utilisateurs dotés de certaines fonctionnalités, telles que add_movies dans un plugin. Le problème est que, selon @ toscho et @ TheDeadMedic , le Le plugin exécute son code trop tôt dans l'ordre des opérations pour utiliser current_user_can.

J'ai essayé d'utiliser if ($user->has_cap('add_movies')) mais obtenir Fatal error: Call to a member function has_cap() on a non-object in xxx.

Est-ce que je manque une solution globale évidente ou la solution est-elle plus compliquée?

1
torinagrippa

La vérification sera appelée trop tôt si vous écrivez simplement dans votre fichier de plugin comme ceci:

if ( current_user_can( 'add_movies' ) ) {
    add_action( 'admin_bar_menu', 'wpse17689_admin_bar_menu' );
}
function wpse17689_admin_bar_menu( &$wp_admin_bar )
{
    $wp_admin_bar->add_menu( /* ... */ );
}

Parce qu'il sera exécuté lorsque vos plugins seront chargés, ce qui est très tôt dans le processus de démarrage.

Ce que vous devez faire, c'est toujours ajouter l'action, mais dans le rappel de l'action, recherchez current_user_can(). Si vous ne pouvez pas effectuer l'action, revenez simplement sans ajouter l'élément de menu.

add_action( 'admin_bar_menu', 'wpse17689_admin_bar_menu' );
function wpse17689_admin_bar_menu( &$wp_admin_bar )
{
    if ( ! current_user_can( 'add_movies' ) ) {
        return;
    }
    $wp_admin_bar->add_menu( /* ... */ );
}
2
Jan Fabry

Essayez-le avec if ( current_user_can('capability') ) : /* your code */; endif;

EDIT: Je n'ai pas lu votre Q complètement. Avez-vous essayé le suivant?

global $current_user;
get_currentuserinfo();

// Here you can start interacting with everything the current user has:
echo '<pre>';
    print_r($current_user); // show what we got to offer
echo '</pre>';

// Then you'll have to do something with the role to get the caps and match against them
0
kaiser