如何更新角色功能

时间:2017-12-22 作者:Johann

我已经手动创建了一个名为“event planner”的角色。我已经为它分配了一些功能,它按预期工作。然而,如果我稍后将其中一个功能从true设置为false(或viceversa),则更改不会反映在Wordpress中。我认为这与Wordpress没有更新功能有关,因为如果我删除角色,然后再次添加代码,那么它就会工作。

有没有一种方法可以“告诉”Wordpress在设置角色功能后更新我的角色功能?

这是我的代码:

$result = add_role( \'event-planner\', __(

\'Event Planner\' ),

array(

\'read\' => true,     
\'delete_others_events\' => false, 
\'delete_private_events\' => true,
\'delete_published_events\' => true, 
\'delete_events\' => true, 
\'edit_others_events\' => false, 
\'edit_private_events\' => true, 
\'edit_published_events\' => true, 
\'edit_events\' => true,
\'publish_events\' => true, 
\'read_private_events\' => true


)

);

3 个回复
SO网友:Jacob Peattie

add_role() 如果角色已经存在,则不会执行任何操作,因此无法使用它修改功能。要修改功能,请使用add_cap()remove_cap() 的方法WP_Role 对象你可以得到WP_Role 为您的角色使用get_role():

$role = get_role( \'event-planner\' );
$role->add_cap( \'edit_others_events\' );
但事实是,角色存储在数据库中,因此添加角色或功能是不应该在每次页面加载时发生的事情。如果要修改现有角色,只需修改一次即可。所以这意味着您需要在主题或插件激活时,或者在保存选项页面时执行此操作。开始创建角色也是如此。

有鉴于此,如果这只是一个存在于您站点上的插件/角色,那么您最好只使用以下插件User Role Editor.

如果它是一个分布式插件,您可以在每个页面上加载的钩子中完成,但只需检查一个选项,查看更新是否已经完成:

function wpse_289293_update_role() {
    // Get current version of user role.
    $version = get_option( \'wpse_289293_roles_version\' )

    // Define version number that represents this change.
    $new_version = 2;

    // If current version is lower than new version.
    if ( $version < $new_version ) {
        // Update the role.
        $role = get_role( \'event-planner\' );
        $role->add_cap( \'edit_others_events\' );

        // Update db to indicate role has been updated.
        update_option( \'wpse_289293_db_version\', $new_version );
    }
}
add_action( \'plugins_loaded\', \'wpse_289293_update_role\' );
由于没有在每个页面上强制重新加载角色的功能,这还具有允许用户使用用户角色编辑器插件自己修改功能的优势。如果add_cap() 每次加载页面时都会运行,这将覆盖他们所做的任何更改。

SO网友:HU ist Sebastian

您可以使用该功能add_cap

可能是这样:

function add_my_capabilities($cap){
     $role = get_role(\'event-planner\');
     $role->add_cap($cap);
}

add_my_capabilities(\'edit_others_events\');

SO网友:Chandan Kumar Thakur

这将节省您更新角色的时间:

$wp_roles = new WP_Roles();
$wp_roles->remove_role("volunteer");
add_role( \'volunteer\', \'Volunteer\',  array(
        \'read\' => true
    ) );

结束

相关推荐

About Wordpress capabilities

我知道WordPress是博客引擎的最佳选择,通过一些插件,如Advance Custom Field,WP可以成为一个很棒的CMS。但它仍然有利于出版商将内容推送给用户。现在我的处境相当严峻。我的朋友想使用WP作为一个引擎,用户可以贡献他们的帖子,其他人可以查看它。是否可以使用WP我可以创建自定义主题(&a);插件可以做到这一点,但当用户在插件上放置很多东西(页面和帖子)时,它对性能有好处吗?