web-dev-qa-db-ja.com

ユーザーの役割に基づいて管理メニュー項目を削除するためのプラグイン?

ユーザーの役割に基づいて、カスタム投稿タイプや分類法などの管理メニュー項目を削除/非表示にできるプラグインを高低で検索しました。

私が試したものはすべて、ユーザーロールに基づいてではなく、グローバルな非表示のみを行います。 adminizeのような他のもっと複雑なものはカスタム投稿タイプや分類法を表示しません。

私は自分自身の関数を書く必要があるのでしょうか、それとも私が見逃している単純なプラグインがありますか?

6
Wyck

更新:

マイクの答えをもう一度読んで、私はあなたが役割に新しい機能を追加し、あなたが除去条件としてそれを使用することができると思っていたので、:

   // first add your role the capability like so
   // get the "author" role object
   $role = get_role( 'administrator' );

   // add "see_all_menus" to this role object
   $role->add_cap( 'see_all_menus' );

   //then remove menu items based on that
   function remove_those_menu_items( $menu_order ){
            global $menu;
            // check using the new capability with current_user_can
            if ( !current_user_can( 'see_all_menus' ) ) {
             foreach ( $menu as $mkey => $m ) {
                //custom post type name "portfolio"
                $key = array_search( 'edit.php?post_type=portfolio', $m );
                //pages menu
                $keyB = array_search( 'edit.php?post_type=page', $m );
                //posts menu
                $keyC = array_search( 'edit.php', $m );

                if ( $key || $keyB || $keyC )
                    unset( $menu[$mkey] );
             }
            }
            return $menu_order;
    }

 //Then just Hook that function to "menu_order"
        add_filter( 'menu_order', 'remove_those_menu_items' );

古い答え

私はマイクが投稿したものに完全に同意します、しかしあなたがカスタムコーディングにまでたまっていないならば 管理者メニューエディタ プラグインを見てください。

レベルごとにアクセス権を設定できます。

8
Bainternet

正確な質問のために作成されたプラグインがあります: 管理メニューを隠す 。このプラグインは次のことができます。

  • Administrator および カスタムユーザーロール など、ユーザーロールに基づいて管理メニュー項目を非表示にする
  • 管理バーの項目も隠すことができます
  • 他のサイトで使用する設定をエクスポート/インポートできます

このプラグインのもう一つの良いところは、直感的で使いやすいことです。

2
Anh Tran

こんにちは @Wyck:

私はきっとあなたのニーズに感謝することができます。私はクライアントに同じことを要求してもらいました。残念ながら、WordPressは管理メニューページつまりメニューセクション)およびメニューサブページつまりメニュー項目)をロールではなくケーパビリティと結び付けています

ただし、代わりにロールに管理メニューオプションを割り当てることを可能にするプラグインコードを書くことはそれほど難しくありません。スクリプトはすべてのメニューオプションに必要な機能を新しい'not-allowed'機能を必要とするように設定してから、現在のユーザーの役割が定義済みの機能を持つすべてのメニューオプションにデフォルトの'read'機能を選択的に割り当てるようコードに設定します。

それでは、もっと大きな問題は、ユーザーロールとメニューオプションのマッピングをどのように表現するかということです。私はかなり複雑な管理ユーザーインターフェイスを必要としていることがわかりました。もちろん、どのロールが何を見ることができるかを定義する配列をハードコードしたいだけなら、それはかなり簡単になるでしょう...

1
MikeSchinkel

これは管理者以外のためにいくつかのメニュー項目だけを保持します。 @ Bainternetのバージョンではadd_capを使用していますが、これはテーマやプラグインのアクティブ化の際に一度だけ行うべきです。

add_action('admin_menu', function () {
    if (current_user_can('administrator')) {
        return;
    }

    /**
     * Keep only specific menu items and remove all others
     */
    global $menu;
    $hMenu = $menu;
    foreach ($hMenu as $nMenuIndex => $hMenuItem) {
        if (in_array($hMenuItem[2], array(
                                         'index.php',
                                         'edit.php?post_type=product',
                                    ))
        ) {
            continue;
        }
        unset($menu[$nMenuIndex]);
    }
}
0
tivnet