WordPress自定义角色无法在自定义文章类型中使用标签和分类的问题

导语:叶子在wordpress主题创建一个bloger的角色,创建了一个blog的文章类型,用于注册博客用户来写博客,但是遇到了一个问题,就是博客用户登录后,写文章无法使用分类和标签。

叶子开始使用的是WordPress自带的分类法‘category’、‘post_tag’,自定义角色写自定义文章类型的文章时,无法使用分类和标签。叶子又使用自定义分类法定义了分类,也不能使用。经过再三研究代码,终于解决了。

自定义文章类型代码

叶子自定义了文章类型博客,使用 capabilities 定义权限,注意,这一点很重要。

function my_custom_post_blog() {
    
    $labels = array(
    'name'                => _x( 'Blogs', 'Post Type General Name', 'whychinatours' ),
    'singular_name'       => _x( 'Blog', 'Post Type Singular Name', 'whychinatours' ),
    'menu_name'           => esc_html__( 'Blogs', 'whychinatours' ),
    'all_items'           => esc_html__( 'All Blogs', 'whychinatours' ),
    'view_item'           => esc_html__( 'View Blog', 'whychinatours' ),
    'add_new_item'        => esc_html__( 'Add New Blog', 'whychinatours' ),
    'add_new'             => esc_html__( 'New Blog', 'whychinatours' ),
    'edit_item'           => esc_html__( 'Edit Blog', 'whychinatours' ),
    'update_item'         => esc_html__( 'Update Blog', 'whychinatours' ),
    'search_items'        => esc_html__( 'Search Blogs', 'whychinatours' ),
    'not_found'           => esc_html__( 'No Blogs found', 'whychinatours' ),
    'not_found_in_trash'  => esc_html__( 'No Blogs found in Trash', 'whychinatours' ),
);
$args = array(
    'label'               => esc_html__( 'blog', 'whychinatours' ),
    'description'         => esc_html__( 'Blogs information pages', 'whychinatours' ),
    'labels'              => $labels,
    'supports'            => array( 'title', 'editor', 'thumbnail', 'author','excerpt', 'comments'),
    'taxonomies'          => array(),
    'hierarchical'        => false,
    'public'              => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'can_export'          => true,
    'has_archive'         => true,
    'exclude_from_search' => false,
    'publicly_queryable'  => true,
    'capability_type'     => 'blog',
    'capabilities' => array(  
        'edit_post' => 'edit_blog',   
        'edit_posts' => 'edit_blogs',   
        'edit_others_posts' => 'edit_others_blogs',   
        'publish_posts' => 'publish_blogs',   
        'read_post' => 'read_blog',   
        'read_private_posts' => 'read_private_blogs',   
        'delete_post' => 'delete_blog',   
    )  ,
    'rewrite' => array('slug' => 'blogs'),
    'query_var' => true,
);

register_post_type( 'blog', $args );	
}
add_action( 'init', 'my_custom_post_blog' );

自定义WordPress角色

WordPress本身有订阅者、投稿者、作者、编辑、管理员的角色,叶子在这里定义了一个Bloger的角色,专门用来发布博客。

function Yct_Add_role() 
{   
    if (get_role('bloger')) {
        remove_role('bloger');
    }
    add_role(
        'bloger', 
        __('Bloger', 'whychinatours'),
        array(
            'read' => true, //read权限表示个人信息
            'read_blog' => true,
            'edit_blog'=> true,
            'edit_blogs'=> true,
            'publish_blogs'=> true,
            'delete_blog' => true,
            'upload_files' => true,
            'level_2' => true,
            'level_1' => true,
            'level_0' => true
        )
    );
}
add_action('init', 'Yct_Add_role');

注意,这个Bloger的角色,除了开始在自定义文章类型里面定义的权限之外,还是需要指定‘read’,这样,登录后才会自动跳转到后台页面,不然,登录后跳转页面会提示你没有权限访问该页,这个该页是指个人信息页。

当然,你也可以强行指定跳转路径到编辑Blog类型的文章上,这样的方式也是可以访问后台的。

另外,如果需要上传文件,就加上‘upload_files’。如果Bloger可以编辑其他人的文章,就加上‘edit_others_blogs’,这里叶子没有加。

自定义分类法

如果使用原生态的分类法,叶子没有找出可以在写blog时使用原生态分类的方法,所以只能使用自定义分类法。

function my_taxonomies_blog() {
    $labels = array(
        'name'              => _x( 'Blog Tag', 'taxonomy 名称' , 'whychinatours'),
        'singular_name'     => _x( 'blog tag', 'taxonomy 单数名称', 'whychinatours' ),
        'search_items'      => __( 'search blog tag' , 'whychinatours'),
        'all_items'         => __( 'Blog tag' , 'whychinatours'),
        'parent_item'       => __( 'parent blog tag' , 'whychinatours'),
        'parent_item_colon' => __( 'parent blog tag' , 'whychinatours'),
        'edit_item'         => __( 'edit blog tag' , 'whychinatours'),
        'update_item'       => __( 'update blog tag' , 'whychinatours'),
        'add_new_item'      => __( 'add blog tag' , 'whychinatours'),
        'new_item_name'     => __( 'add blog tag' , 'whychinatours'),
        'menu_name'         => __( 'Blog tag' , 'whychinatours'),
    );
    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'capabilities' => array(  
            'manage_terms' => 'manage_categories',   
            'edit_terms' => 'manage_categories',   
            'delete_terms' => 'manage_categories',   
            'assign_terms' => 'edit_blogs'
        )  ,
    );
    register_taxonomy( 'blogs-tag', 'blog', $args );

}

add_action( 'init', 'my_taxonomies_blog', 0 );

注意,关键点在于注册分类法的时候,将分配标签的子权限‘assign_terms’指定到‘edit_blogs’,也就这一句:

'assign_terms' => 'edit_blogs'

这样的话,自定义角色用户(Bloger)登录后,编辑自定义文章类型(blog)的文章,就是可以分配自定义分类法(blogs-tag)的标签了。

结束

你学会了吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注