2017-09-14 65 views
0

我在我的functions.php文件中創建了一個自定義帖子類型「produktionsauftrag」。對於特定的用戶角色(woocommerce的shop_manager),我需要此自定義帖子類型的特殊權限。wordpress自定義帖子類型的能力read_(cpt)不可用

shop_manager應該能夠創建一個帖子,但不能編輯它(只讀)。當我創建我的自定義後的類型,其自身capability_type我可以改變的權利,但沒有read_cpt的選擇,因爲你可以看到:

enter image description here

我如何添加一個read_auftrags選項?我的自定義後類型的functions.php:

function cptui_register_my_cpts_produktionsauftrag() { 

    /** 
    * Post Type: Produktionsaufträge. 
    */ 

    $labels = array(
     "name" => __("Produktionsaufträge", ""), 
     "singular_name" => __("Produktionsauftrag", ""), 
     "menu_name" => __("Produktionsaufträge", ""), 
     "all_items" => __("Alle Produktionsaufträge", ""), 
     "add_new" => __("Produktionsauftrag erstellen", ""), 
     "add_new_item" => __("Produktionsauftrag erstellen", ""), 
     "edit_item" => __("Produktionsauftrag anpassen", ""), 
     "new_item" => __("Neuer Produktionsauftrag", ""), 
     "view_item" => __("Produktionsauftrag anzeigen", ""), 
     "view_items" => __("Produktionsaufträge anzeigen", ""), 
     "search_items" => __("Produktionsauftrag suchen", ""), 
     "not_found" => __("Keine Produktionsaufträge gefunden", ""), 
     "not_found_in_trash" => __("Keine Produktionsaufträge gefunden", ""), 
     "items_list" => __("Produktionsauftragsliste", ""), 
    ); 

    $args = array(
     "label" => __("Produktionsaufträge", ""), 
     "labels" => $labels, 
     "description" => "", 
     "public" => true, 
     "publicly_queryable" => false, 
     "show_ui" => true, 
     "show_in_rest" => false, 
     "rest_base" => "", 
     "has_archive" => false, 
     "show_in_menu" => true, 
     "exclude_from_search" => false, 
     'capability_type' => 'auftrag', 
     "map_meta_cap" => true, 
     "hierarchical" => false, 
     "rewrite" => array("slug" => "produktionsauftrag", "with_front" => true), 
     "query_var" => true, 
     "supports" => array("title", "author"), 
    ); 

    register_post_type("produktionsauftrag", $args); 
} 

add_action('init', 'cptui_register_my_cpts_produktionsauftrag'); 
+0

讀取默認是開啓的所有帖子啓用。您是否在閱讀您的帖子時遇到問題? – FluffyKitten

+0

不,我沒有閱讀我的帖子的任何問題。問題是我創建了一個自定義的帖子類型,一個user_role應該能夠發佈這個帖子類型的新帖子,並閱讀它,但不會在發佈後進行編輯。在插件用戶角色編輯器中,我無法看到只讀read_private_(cpt-name)的功能read_(cpt-name)。 – Peesen87

+0

這是因爲'閱讀'是所有文章的默認設置,因此您無法打開和關閉自定義文章類型的功能。 – FluffyKitten

回答

1

read能力是不是可以應用到CPT標準的能力,但它看起來像你可以設置它。

接受一個CPT作爲能力陣列的一部分的功能是:

  • edit_posts,edit_others_posts,publish_posts,read_private_posts
  • 元功能:edit_post,read_post,和delete_post

元功能是用戶的功能gr anted一個每帖的基礎上,並獲得映射到以下基本功能:

  • 讀,edit_published_posts,edit_private_posts,create_posts,delete_posts,delete_private_posts,delete_published_posts,delete_others_posts

注意,這裏的代碼用於wordpress.stackexchange.com上的問題/答案,這似乎與Codex相矛盾(見下文)。但是,如果它適用於其他人,它的價值首先在嘗試!

自定義文章類型:

您可以明確地設置這樣的功能(它可能當您使用"map_meta_cap" => true自動完成,但其並不清楚):

function cptui_register_my_cpts_produktionsauftrag() { 

    [...] 

    $args = array(

     [...] 

     'capability_type' => 'auftrag', 
     "map_meta_cap" => true, /* You need this (which you already had) */ 

     /* set the capabilities for both plural AND single, e.g. */ 
     'capabilities' => array(
      'publish_posts' => 'publish_auftrags', 
      'edit_posts' => 'edit_auftrags', 
      'edit_others_posts' => 'edit_other_auftrags', 
      'delete_posts' => 'delete_auftrags', 
      'read_private_posts' => 'read_private_auftrags', 
      'edit_post' => 'edit_auftrag', 
      'delete_post' => 'delete_auftrag' 
      'read_post' => 'read_auftrag', 
     ), 
    ); 

    register_post_type("produktionsauftrag", $args); 
} 
    add_action('init', 'cptui_register_my_cpts_produktionsauftrag'); 


然後你應該將這些功能添加到適當的用戶角色中。請注意,在其中一個答案中提到,您需要向管理員添加功能以便能夠編輯管理員中的帖子。

add_action('init', 'add_produktionsauftrag_caps_role'); 
function add_produktionsauftrag_caps_role() { 

    /* Get the roles you want to add capabilities for, e.g. */ 
    $roles = array(get_role('shop_manager'), get_role('administrator')); 

    /* Add the capabilities for each role */ 

    foreach($roles as $role) { 
     if($role) { 
      /* Add the primitive capabilities, e.g.: */ 
      $role->add_cap('edit_auftrag'); 
      $role->add_cap('edit_auftrags'); 
      $role->add_cap('edit_others_auftrags'); 
      $role->add_cap('publish_auftrags'); 
      $role->add_cap('read_auftrag'); 
      $role->add_cap('read_private_auftrag'); 
      $role->add_cap('delete_auftrag'); 
      $role->add_cap('edit_published_auftrags'); 
      $role->add_cap('delete_published_auftrags'); 
     } 
    } 
} 

如果上述不起作用:

  1. 以上是在一些對wordpress.stackexchange.com問題中,雖然有些不設置在功能陣列CPT ......他們只能將角色添加到角色中(這個答案中的第二個代碼塊)。如果您在上面的代碼中遇到問題,請嘗試僅添加add_produktionsauftrag_caps_role函數。

  2. 即使是這些問題/答案做以上,食品說,元功能不應分配給任何角色,他們必須被映射到相應的map_meta_cap()原始功能。

此外,根據食品法典委員會:

當某個用戶有隻用交型能力是不夠的,創建新的對象一個角色......這是因爲自定義元功能帖子類型沒有被自動映射,所以我們無法精確控制權限。要爲自定義帖子類型映射元功能,我們可以使用map_meta_cap鉤子,因爲它在這裏解釋爲:http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types

...所以即使在wordpress.stackexchange.com上的問題/答案沒有使用map_meta_cap,您可能需要。

參考文獻:

+0

非常感謝您的幫助。我試圖獲得閱讀能力,但無法得到你的幫助。我仍然只有一個read_priveate_(postname)功能。我知道使用javascript解決它,它不是一個好的解決方案,但它的所有我擁有。 – Peesen87

+0

@ Peesen87我不確定你甚至可以通過插件設置元功能(你的截圖看起來像使用用戶角色編輯器?)。這個答案應該直接在代碼中設置能力,而不需要使用單獨的插件,這樣'read'功能就不會出現在插件中:) – FluffyKitten

相關問題