web-dev-qa-db-ja.com

特定の管理者メニューにアクセスする機能を削除する

寄稿者の役割を持つユーザーの管理機能の一部を削除しようとしています。管理機能のいくつかを削除すると、コメント、ツール、メディアなどの特定の管理メニュー項目が表示されなくなります。このコードを使用して、管理メニューから必要な項目を削除できました。

function remove_menus(){

$author = wp_get_current_user();
if(isset($author->roles[0])){ 
    $current_role = $author->roles[0];
}else{
    $current_role = 'no_role';
}

if($current_role == 'contributor'){  
  remove_menu_page( 'index.php' );                  //Dashboard
  remove_menu_page( 'edit.php' );                   //Posts
  remove_menu_page( 'upload.php' );                 //Media
  remove_menu_page( 'tools.php' );                  //Tools
  remove_menu_page( 'edit-comments.php' );               //Comments

}

}
add_action( 'admin_menu', 'remove_menus' );

それは御馳走を働きます。私が直面している問題は、私が手動でURLにクエリ文字列を追加することができるということです。これらのページへのアクセスを制限したり、管理者メニューから隠したりする方法を知っている人はいますか?

1
RoseCoder

私は最後にそれを考え出しました、そしてこれは私が使用したコードです:

function restrict_menus() {
    $author = wp_get_current_user();

    if( isset( $author->roles[0] ) ) { 
        $current_role = $author->roles[0];
    } else {
        $current_role = 'no_role';
    }

    if( 'contributor' == $current_role ) {  
        $screen = get_current_screen();
        $base   = $screen->id;


        if( 'edit-post' == $base || 'upload' == $base || 'tools' == $base || 'edit-comments' == $base ) {
            wp_die( 'Cheatin’ uh?' );
        }
    }
}
add_action( 'current_screen', 'restrict_menus' );
3
RoseCoder

私は通常 Membersプラグイン を使用しています(そして推奨しています)。 UIは非常に使いやすく、ロール/パーミッションのロジックを(コードではなく)データベースに格納するという追加の利点があります。これにより、「オンザフライ」での変更が簡単になります。

このプラグインを使用すると、カスタムロールを作成し(「Photo Editor」や「Comment Approver」などと呼ばれるものを発明したい場合もあります)、表示およびアクセスできるメニューを制限することもできます。私はこれがまさにあなたが望むことをすると思います。

1
Jared Cobb

あなたは カスタムロールを作成することができます s_da_humによって提案されたように/ /このコードをあなたの子テーマのfunctions.phpファイルに追加することによって貢献者ロールから機能を削除することができます。

add_action( 'init', 'wpsites_remove_contributor_capabilities' );

function wpsites_remove_contributor_capabilities() {

$contributor = get_role( 'contributor' );

$caps = array(
    'edit_posts',
    'delete_posts',
);

foreach ( $caps as $cap ) {

    $contributor->remove_cap( $cap );
    }
}

ソース https://codex.wordpress.org/Function_Reference/add_role

1
Brad Dalton

私はこの質問がすでに答えられていることを知っています、そして古いです。しかし、私は代替の解決策を提供したいと思いました。これは私がしばらく前に書いたプラグインの中で私がやった方法です(私はあなたのページを使うように私のコードを修正しました)。

寄稿者ロールを制限したいので、 ロール機能 を使用できます。投稿者は投稿を公開できないため、次の操作を実行できます。

パート1:管理メニューから項目を削除する

add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {

    // don't do anything if the user can publish posts
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // remove these items from the admin menu
    remove_menu_page( 'edit.php' );          // Posts
    remove_menu_page( 'upload.php' );        // Media
    remove_menu_page( 'tools.php' );         // Tools
    remove_menu_page( 'edit-comments.php' ); // Comments

}

しかしあなたが言ったように、それはまだ直接ページのURLに入ることからユーザーを制限しません。これが私のページ制限の書き方です。

パート2:管理ページへのアクセスを制限する

add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {

    // don't do anything if the user can publish posts
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // retrieve the current page's ID
    $current_screen_id = get_current_screen()->id;

    // determine which screens are off limits
    $restricted_screens = array(
        'edit',
        'upload',
        'tools',
        'edit-comments',
    );

    // Restrict page access
    foreach ( $restricted_screens as $restricted_screen ) {

        // compare current screen id against each restricted screen
        if ( $current_screen_id === $restricted_screen ) {
            wp_die( __( 'You are not allowed to access this page.', 'tcd' ) );
        }

    }

}

私にとっては、ロール機能と配列を使用すると作業が少し楽になりました。とにかく、私はこの方法が役立つと思います。

乾杯。

0
Mr. Curious