wordpress自定义帖子类型功能read_(cpt)不可用

时间:2017-09-14 08:01:13

标签: wordpress

我创建了一个自定义帖子类型" produktionsauftrag"在我的functions.php文件中。对于特定的用户角色(来自woocommerce的shop_manager),我需要此自定义帖子类型的特殊权限。

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' );

1 个答案:

答案 0 :(得分:1)

read功能不是您可以应用于CPT的标准功能,但看起来您可以设置它。

作为功能数组的一部分,CPT接受的功能包括:

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

元功能是基于每个帖子授予用户的功能,并且映射到以下原始功能:

  • read,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. 即使那些问题/答案都是上述内容,Codex也说不应该分配给任何角色,它们必须映射到{{1}中相应的原始功能}}。

  3. 另外,根据法典:

      

    当一些用户只拥有帖子类型功能的角色时,创建新对象是不够的......这是因为自定义帖子类型的元素功能没有被自动映射,所以我们无法进行精细控制权限。要映射自定义帖子类型的元素功能,我们可以使用map_meta_cap()钩子,如下所示:http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types

    ...所以即使wordpress.stackexchange.com上的问题/答案没有使用map_meta_cap,你也可能需要。

    参考文献: