web-dev-qa-db-ja.com

管理者以外のユーザーのカスタム投稿タイプメニューを削除します。

私は一日中これを調査してきた、そして多くの結果を思い付いていない。

自分のカスタム投稿タイプを表示できるユーザーをユーザーレベル別(またはその他の方法)に制限します。そのため、ログインした人が「管理者」ではない場合、追加されたカスタム投稿タイプは表示されません。

これは私が持っているカスタム投稿タイプの一部です:

add_action('init', 'portfolio_register');

function portfolio_register() {

    $labels = array(
        'name' => _x('Case Studies', 'post type general name'),
        'singular_name' => _x('Case Study Item', 'post type singular name'),
        'add_new' => _x('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Case Study Item'),
        'edit_item' => __('Edit Case Study Item'),
        'new_item' => __('New Case Study Item'),
        'view_item' => __('View Case Study Item'),
        'search_items' => __('Search Case Studies'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        /*'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',*/
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

そして、ここに私が見つけた潜在的な解決策がカスタム投稿タイプメニューの削除にはうまくいかないことがあります:

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login != 'admin')
    {
        $restricted = array(__('Posts'),
                            __('Media'),
                            __('Links'),
                            __('Pages'),
                            __('Comments'),
                            __('Appearance'),
                            __('Plugins'),
                            __('Users'),
                            __('Tools'),
                            __('Settings')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
}
add_action('admin_menu', 'remove_menus');

上記はデフォルトのメニュー項目を削除するためのものですが、カスタム投稿タイプメニューを削除することはできませんでした。さらに、それはユーザー名に固有のものです。複数のユーザーを追加することができれば、問題ありません。

global $user_login;
get_currentuserinfo();
   if (!current_user_can('update_plugins')) {
      .......
   }

上記はまったくうまくいきませんでした。

ありがとう。

2
jetDL

コーデックス - 登録投稿タイプ

capability_typeregister_post_typeおよびcapabilities引数を参照してください。 capabilities引数に必要なキャップにマッピングするためのケーパビリティの配列を渡すことができます。これはカスタムケーパビリティを持つargs配列の例です。

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => true,
    'capabilities' => array(
        'publish_posts' => 'ADD_CAP_HERE',
        'edit_posts' => 'ADD_CAP_HERE',
        'edit_others_posts' => 'ADD_CAP_HERE',
        'delete_posts' => 'ADD_CAP_HERE',
        'delete_others_posts' => 'ADD_CAP_HERE',
        'read_private_posts' => 'ADD_CAP_HERE',
        'edit_post' => 'ADD_CAP_HERE',
        'delete_post' => 'ADD_CAP_HERE',
        'read_post' => 'ADD_CAP_HERE',
    ),
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
); 

もちろんADD_CAP_HEREをケイパビリティに置き換えます。この投稿タイプを管理者に限定したい場合は、管理者だけが持っている機能(manage_optionsなど)を使用してください。

役割とその上限の表(早見用)。
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

14
t31os

さて、もう少しグーグルをした後、私はついに答えを見つけ、それを上記のスクリプトの1つと組み合わせて、私がしたいことを作成しました。他の誰かが同じことをやろうとしている場合に備えて、以下は私がしたことです。

global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
    .....
}

上記のコードは現在のユーザレベルを取得し、それらがプラグインを更新/編集する権限を持っている場合、彼らは囲まれた機能へのアクセス権を持ちます。

add_filter( 'custom_menu_order', 'toggle_custom_menu_order' );

function remove_those_menu_items( $menu_order ){
    global $menu;

    foreach ( $menu as $mkey => $m ) {
        $key = array_search( 'edit.php?post_type=portfolio', $m );
        $keyB = array_search( 'edit.php?post_type=bio', $m );
        $keyC = array_search( 'edit.php?post_type=philo', $m );

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

    return $menu_order;
}
add_filter( 'menu_order', 'remove_those_menu_items' );

上記は実際にあなたが管理者メニューシステムからカスタム投稿タイプを削除することを可能にするものです。必要なだけ$keyを追加するだけです。私の代わりに、上記の意味が オリジナルから読むことができることについて詳細に説明する

4
jetDL

私はコードに何が悪いのかわからないが、私が使用するユーザーにメニュー項目を制限する必要があるときはいつでも: 管理者メニューエディタ ちょうどあなたのためにそれをするプラグイン。

0
Bainternet