【问题标题】:WordPress: Capabilities for custom post typesWordPress:自定义帖子类型的功能
【发布时间】:2012-01-02 03:20:02
【问题描述】:

我正在编写一个创建自定义 post_type 的插件。我还希望插件创建一个只能添加/编辑/删除新 post_type 的自定义角色。我尝试了几个插件(Role Scoper、高级访问管理器),它们允许我重新定义或创建新角色,但它们不允许我分配特定于新 post_type 的功能。例如,我想允许添加/编辑我的新 post_type 但不允许添加/编辑普通帖子/页面。

根据我的阅读,我可以使用add_role() 函数添加新角色。此函数的参数之一是“功能”数组,似乎定义为here。我认为我需要的是能够添加特定于我的 post_type 的功能。这可能吗?

【问题讨论】:

    标签: wordpress custom-post-type capability


    【解决方案1】:

    自定义帖子类型的功能

    函数register_post_type()$capabilities 数组作为其(可选)参数之一。

    它可能看起来像这样:

    $capabilities = array(
        'publish_posts' => 'publish_ypts',
        'edit_posts' => 'edit_ypts',
        'edit_others_posts' => 'edit_others_ypts',
        'delete_posts' => 'delete_ypts',
        'delete_others_posts' => 'delete_others_ypts',
        'read_private_posts' => 'read_private_ypts',
        'edit_post' => 'edit_ypt',
        'delete_post' => 'delete_ypt',
        'read_post' => 'read_ypt'
    );
    

    其中“ypt”代表“您的帖子类型”。

    之后,您可以向您的 WordPress 添加一个新角色,该角色具有这些确切功能(可能还有更多标准 WordPress 功能):

    add_role(
        'ypt_author',
        'Author of your post type',
        array(
            'publish_ypts' => true,
            'edit_ypts' => true,
            'edit_others_ypts' => true,
            'delete_ypts' => true,
            'delete_others_ypts' => true,
            'read_private_ypts' => true,
            'edit_ypt' => true,
            'delete_ypt' => true,
            'read_ypt' => true,
            // more standard capabilities here
        )
    );
    

    后者可以使用插件完成,例如,查看 Justin Tadlock 的 Members 插件。

    详尽的例子

    给你一个更具体的例子:

    /* REGISTER POST TYPE */
    
    add_action('init', 'ypt_register');
    
    function ypt_register()
    {
    
        $labels = array(
            'name' => _x('YPTs', 'post type general name'),
            'singular_name' => _x('YPT', 'post type singular name'),
            'add_new' => _x('Add New YPT', 'Team item'),
            'add_new_item' => __('Add a new post of type YPT'),
            'edit_item' => __('Edit YPT'),
            'new_item' => __('New YPT'),
            'view_item' => __('View YPT'),
            'search_items' => __('Search YPTs'),
            'not_found' =>  __('No YPTs found'),
            'not_found_in_trash' => __('No YPTs currently trashed'),
            'parent_item_colon' => ''
        );
    
        $capabilities = array(
            // this is where the first code block from above goes
        );
    
        $args = array(
            'labels' => $labels,
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'query_var' => true,
            'rewrite' => true,
            'capability_type' => 'ypt',
            'capabilities' => $capabilities,
            'hierarchical' => false,
            'menu_position' => null,
            'supports' => array( 'title', 'author', 'thumbnail' )
        ); 
    
        register_post_type( 'ypt' , $args );
    
        flush_rewrite_rules( false );
    }
    
    
    /* MAP META CAPABILITIES */
    
    add_filter( 'map_meta_cap', 'ypt_map_meta_cap', 10, 4 );
    
    function ypt_map_meta_cap( $caps, $cap, $user_id, $args )
    {
    
        if ( 'edit_ypt' == $cap || 'delete_ypt' == $cap || 'read_ypt' == $cap ) {
            $post = get_post( $args[0] );
            $post_type = get_post_type_object( $post->post_type );
            $caps = array();
        }
    
        if ( 'edit_ypt' == $cap ) {
            if ( $user_id == $post->post_author )
                $caps[] = $post_type->cap->edit_posts;
            else
                $caps[] = $post_type->cap->edit_others_posts;
        }
    
        elseif ( 'delete_ypt' == $cap ) {
            if ( $user_id == $post->post_author )
                $caps[] = $post_type->cap->delete_posts;
            else
                $caps[] = $post_type->cap->delete_others_posts;
        }
    
        elseif ( 'read_ypt' == $cap ) {
            if ( 'private' != $post->post_status )
                $caps[] = 'read';
            elseif ( $user_id == $post->post_author )
                $caps[] = 'read';
            else
                $caps[] = $post_type->cap->read_private_posts;
        }
    
        return $caps;
    }
    

    【讨论】:

    • publish_ypt 或任何其他 post_type 特定功能如何定义?
    • @Emerson 我回答的第一部分那个定义。 $capabilities 数组是您放入 register_post_type() 函数的参数之一。在其中,您将新功能映射到常规帖子的等效功能。如果在没有此可选参数的情况下使用 register_post_type(),则应用常规功能。如果使用它,则 pubish_posts 功能不包括您的帖子类型 - 作者必须具有 publish_ypt 功能。
    • 哦,我明白了。我很困惑,因为 codex 中 add_role() 的第三个参数称为 $capabilities。所以我在你的第二个函数中使用了那个数组。我会修复它报告。
    • @Emerson 查看我上面的编辑或检查您的 pastebin 的 my version。请注意,由于您显然想要父母和孩子,因此需要将'hierarchical' 设置为true。否则,我的示例也适用于您的字典条目。
    • 我编辑了我的代码,但我能找到的唯一缺少的是:'capability_type' => 'dictionary_entry',它仍然不起作用,但我认为我必须有别的东西'我失踪了。
    【解决方案2】:

    如今(WP 3.5+),这要容易得多。只需将map_meta_cap 参数设置为TRUE 并在注册帖子类型时为capability_type 参数选择string(通常是帖子类型名称)。

    一个简单的var_dump( $GLOBALS['wp_post_types']['new_custom_post_type'] ) ); 将显示如下内容。

    [cap] => stdClass Object
    (
        [edit_post]      => "edit_{$capability_type}"
        [read_post]      => "read_{$capability_type}"
        [delete_post]        => "delete_{$capability_type}"
        [edit_posts]         => "edit_{$capability_type}s"
        [edit_others_posts]  => "edit_others_{$capability_type}s"
        [publish_posts]      => "publish_{$capability_type}s"
        [read_private_posts]     => "read_private_{$capability_type}s"
            [delete_posts]           => "delete_{$capability_type}s"
            [delete_private_posts]   => "delete_private_{$capability_type}s"
            [delete_published_posts] => "delete_published_{$capability_type}s"
            [delete_others_posts]    => "delete_others_{$capability_type}s"
            [edit_private_posts]     => "edit_private_{$capability_type}s"
            [edit_published_posts]   => "edit_published_{$capability_type}s"
    )
    

    更多预期的数组部分是其他七个原始功能,它们不由核心检查,但在帖子类型注册期间由map_meta_caps() 映射。

    【讨论】:

    • 对于还在学习的新手,将 map_meta_cap 设置为 true 并将 capability_type 设置为您的内容类型,将自动为您生成功能,因此您不必指定它们。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多