阻止自定义用户角色添加新页面

时间:2019-07-12 作者:Shane Akira

如何防止自定义用户角色无法添加新页面。

我的用户角色具有以下一系列功能:

    $args = array(
        \'delete_others_pages\' => false,
        \'delete_others_posts\' => false,
        \'delete_pages\' => false,
        \'delete_posts\' => true,
        \'delete_private_pages\' => false,
        \'delete_private_posts\' => true,
        \'delete_published_pages\' => false,
        \'delete_published_posts\' => true,
        \'edit_others_pages\' => true,
        \'edit_others_posts\' => true,
        \'edit_pages\' => true,
        \'edit_posts\' => true,
        \'edit_private_pages\' => true,
        \'edit_private_posts\' => true,
        \'edit_published_pages\' => true,
        \'edit_published_posts\' => true,
        \'manage_categories\' => true,
        \'manage_links\' => true,
        \'moderate_comments\' => true,
        \'publish_pages\' => false,
        \'publish_posts\' => true,
        \'create_pages\' => false, //THIS SETTING DOES NOT WORK / EXISTS
        \'read\' => true,
        \'read_private_pages\' => true,
        \'read_private_posts\' => true,
        \'upload_files\' => true,
    }
通过这些设置,我的用户角色仍然可以“添加新页面”,但该页面将由管理员提交“审阅”。

我的用户应该能够“编辑现有页面”,但不能“添加新页面”或“删除”任何页面。

对于“帖子”,用户应该能够“添加新”、“更新”和“删除”任何帖子(完全控制)。“自定义帖子类型”也是如此。

顺致敬意,

谢恩·马德森

2 个回复
SO网友:Jacob Peattie

WordPress中的帖子类型有一个功能列表,可以控制围绕它们的权限。这些是:

edit_post
read_post
delete_post
edit_posts
edit_others_posts
publish_posts
read_private_posts
read
delete_posts
delete_private_posts
delete_published_posts
delete_others_posts
edit_private_posts
edit_published_posts
create_posts
在内部,每个帖子类型都与WordPress中提供的实际功能相匹配。大多数情况下,它们都有完全相同的名称。所以edit_posts 的能力post 岗位类型为edit_posts, 而edit_posts 的功能page 岗位类型为edit_pages.

唯一的例外是create_posts. 这是WordPress检查的帖子类型功能,以确定用户是否可以创建该类型的新帖子。它检查以下内容:

if ( current_user_can( get_post_type_object( \'page\' )->cap->create_posts ) ) {}
与其他功能不同,用于帖子和页面create_posts 实际映射到edit_postsedit_pages 分别,不create_postscreate_pages, 这是不存在的。

所以如果你打印get_post_type_object( \'page\' )->cap->create_posts 你会发现这个值是edit_pages, 具有该功能的用户可以看到添加新按钮。因为这是edit_pages 而不是publish_pages, 它允许用户创建新的页面和帖子,即使他们不能发布它们,它们也会被放入待审核状态,这是你想要防止的行为。

对于自定义帖子类型,可以通过设置create_postscapabilities 其他论点:

register_post_type(
    \'my_custom_type\',
    [
        \'capabilities\' => [
            \'create_posts\' => \'manage_options\',
        ],
    ]
);
对于该自定义帖子类型,只有manage_options 将能够添加新的帖子。

对于内置的帖子类型,可以使用register_post_type_args 筛选以设置此功能,但您希望默认帖子类型:

function wpse_342743_create_page_capability( $args, $post_type ) {
    if ( \'page\' === $post_type ) {
        $args[\'capabilities\'] = [ 
            \'create_posts\' => \'manage_options\',
        ];
    }

    return $args;
}
add_filter( \'register_post_type_args\', \'wpse_342743_create_page_capability\', 10, 2 );
使用该代码时,只有manage_options 将能够创建新的页面,但如果有其他内容,他们仍可以在不进行审查的情况下进行更新edit_pagespublish_pages. 您可以将此功能更改为delete_pages 这样,只有能够删除页面的用户才能创建页面,或者您可以将自己的自定义功能传递给用户,让他们能够创建页面。

SO网友:Oscprofessionals

此参数应适用于此

\'publish_pages\' => false,

相关推荐

正在尝试获取wp-includes/capabilities.php中非对象的属性

在调试中,我每分钟都会收到以下通知序列。日志:[23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/capabilities.php on line 1022 [23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/