2016-08-02 10 views
0

私の問題は、非管理者が新しいウィジェットを作成できないことを除いて、すべての機能が期待通りに機能することです。 [新規追加]ボタンはありますが、クリックすると「十分な権限がありません」というメッセージが表示されます。クライアントはedit_postsのようなすべての標準機能をチェックしていません(私が現れる前に他の何らかの理由で)。だから多分それは問題ですか?関連するコードは次のとおりです。カスタム機能を追加するWordpress - ユーザーが新しいカスタム投稿タイプを作成できない

public static function manage_plugin_cap($action = 'add_cap'){ 

$roles = get_editable_roles(); 
$caps = array('edit_widget','edit_widgets','read_widgets'); 
$admin_caps = array('edit_other_widgets','publish_widgets','read_private_widgets','delete_widgets'); 
foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) { 
    if (isset($roles[$key])) {  
     if ($key == 'administrator'){ 
      foreach ($admin_cap as $c){ 
       if ($action=='add_cap') 
        {$role->add_cap($c, false);} 
       else {$role->{$action}($c);} 
      } 
     } 
     foreach ($cap as $c){ 
      if ($action=='add_cap') 
       {$role->add_cap($c, false);} 
      else {$role->{$action}($c);} 
     } 
    } 
} 
} 
register_post_type($this->prefix.'_'.$single, $args); 
$args = array(
      'labels'    => $labels, 
      'description'  => __('Description.', $this->text_domain), 
      'public'    => true, 
      'publicly_queryable' => true, 
      'show_ui'   => true, 
      'show_in_menu'  => 'edit.php?post_type={$single}', 
      'query_var'   => true, 
      'rewrite'   => array('slug' => $single,'with_front'=>true), 
      'capability_type' => 'widget', 
      'has_archive'  => $plural, 
      'can_export'   => true, 
      'hierarchical'  => false, 
      'menu_position'  => null 
); 

誰かが迷っていることは誰に見えますか?私は 'create_widgets'を成功させずに 'publish_widgets'をすべてのロールに追加しようとしました(私にはできないようにしたいと思いますが)。ありがとう!

編集:私はargsから 'capability_type'を削除しました。私は自分自身を追加することを定義するときには必要ではないと思います(既存の機能からマッピングするときにのみ必要なので、新しい名前の名前を知ることができます)。

更新:私はこれを試して正しいものに戻す機会を得ました。

'capability_type' => 'widget', 
'map_meta_cap'  => false, 

create_widgets以外のすべてのために働くように見えるん: は、私は私のregister_post_type配列内のこれらの要素を持っています。 私は$ GLOBALS [ 'wp_post_types'] [ 'my_cpt']をダンプするとき、私はそれがedit_widgets」として 'create_posts' を示し、なぜだから私はよく分からない

public 'cap' => 
    object(stdClass)[434] 
     public 'edit_post' => string 'edit_widget' (length=10) 
     public 'read_post' => string 'read_widget' (length=10) 
     public 'delete_post' => string 'delete_widget' (length=12) 
     public 'edit_posts' => string 'edit_widgets' (length=11) 
     public 'edit_others_posts' => string 'edit_others_widgets' (length=18) 
     public 'publish_posts' => string 'publish_widgets' (length=14) 
     public 'read_private_posts' => string 'read_private_widgets' (length=19) 
     public 'create_posts' => string 'edit_widgets' (length=11) 

を取得しますか?

答えて

1

"このページにアクセスするための十分な権限がありません。"メッセージは、投稿が作成された管理ページにアクセスできないことを意味します。これは、「edit_widgets」のような他の機能の前にチェックされます。たとえば、あなたの場合、ユーザーは「edit_widgets」機能を持ち、理論的に彼は新しい「ウィジェット」投稿を作成できますが、投稿が作成される管理ページにはアクセスできません。

register_post_typeの "show_in_menu"パラメータが "true"以外の場合、 "Add {post_type}"のようなデフォルトメニュー項目が作成されないため、ユーザーは組み込みが必要になります"post-new.php?post_type = {post_type}"(新しい投稿を作成する場所)にアクセスする "edit_posts"機能

回避策:

  1. をtrueに設定し、 "show_in_menu":デフォルトのメニューが
  2. グラント "edit_posts" 機能を作成されます(もちろん、それは、ユーザーが "edit_posts" 機能を共有して記事を作成できるようになります)。
  3. 手動でサブメニューを追加し、ページにアクセスするための必要な機能として「edit_widgets」を設定します(このメニューページが第2レベルのメニュー項目にネストされていれば表示されません。ここでメニューの親)

    add_submenu_page({parent_menu_link}, 'Add Widget', 'Add Widget', 'edit_widgets', 'post-new.php?post_type={post_type}');

キーは「edit_widgets」能力を持っている誰もがアクセスできるページ「ウィジェットを追加」になります「edit_widgets」機能です。

PS:あなたもtrueに「map_meta_cap」を設定する必要があるかもしれません、私はこの1 out.Iが誤って「create_posts」をマッピングして考え出したと思うhttps://codex.wordpress.org/Function_Reference/register_post_type

+0

お役立ち情報私が思い出すと、私はその許可を得てしまいました。私たちはそれをすべて考え出しました。私はそれが長期的に良くなったと思うので、それを変更する可能性は低いので、私はこの答えをテストすることができます。しかし、私がテストに回ったり、誰かがこれがうまくいくと答えた場合は、答えとしてそれを受け入れることができてうれしいです。ありがとうございました! – user3080408

+0

私はこれをもう一度見ています。あなたの回避策、#1は動作しますが、メニューを制御したいと思います。グループ内の各cptのサブメニュー項目を追加しました。私の役割はedit_widgetsを持っています。私はチェックし、役割と現在のユーザーのためにそこにあります...また、私はtrueにmap_meta_capを設定します。助けてくれてありがとう! – user3080408

0

を参照してください。私は私の質問で述べたように、デフォルトのWPの動作は次のようにマップすることです:

役割を作成するときに、私はだから私は、デフォルトのように戻ってマッピングに行き、この

'create_posts' => 'create_widgets', 

のようにマッピングされた

'create_posts' => 'edit_widgets' 

できます。

関連する問題