web-dev-qa-db-ja.com

特定の機能を持つユーザーにのみ管理バーメニュー項目を表示する方法

管理バーにアイテムを追加しようとしていますが、プラグインのadd_moviesなどの特定の機能を持つユーザーのみに限定しています。問題は、 @ toscho@ TheDeadMedic に従って、プラグインは、current_user_canを使用するには操作の順序が早すぎてコードを実行します。

if ($user->has_cap('add_movies'))を使ってみましたがFatal error: Call to a member function has_cap() on a non-object in xxx.を手に入れました

明白なグローバルを見逃していませんか?それとも解決策はもっと複雑ですか?

1
torinagrippa

このようにプラグインファイルに書き込むだけでは、チェックは早く呼び出されます。

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( /* ... */ );
}

プラグインがロードされたときに実行されるため、起動プロセスの非常に早い段階です。

あなたがすべきことは常にアクションを追加することですが、その後アクションのコールバックでcurrent_user_can()をチェックします。あなたがアクションを実行できない場合は、メニュー項目を追加せずに戻るだけです。

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

if ( current_user_can('capability') ) : /* your code */; endif;で試してください

編集:あなたのQを完全に読んでいない。次のことを試しましたか?

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