add_role()只运行一次?


11

我惊讶地发现add_role()修改了数据库,并且如果角色已经存在则失败。这里有两个含义,一个比另一个严重:1)如果您正在开发并更新add_role代码,则必须首先remove_role()2)一旦正确,就永远不必运行该代码再次。

因此,通常我一直将add_role()放在wp_loaded动作挂钩中。并且由于我正在开发中,所以我还在add_role之前添加了remove_role(),因此可以确定,如果我修改了大写字母列表,它将实际上生效。

但是很明显,每次访问博客页面时都在运行此命令。好的,我可以将其置于仅限管理员的操作中,也可以在“用户”或“工具”下创建一个插件页面,该角色可以一次创建。我想我希望有一个更简单,更优雅的解决方案。

我不认为这里有一次run_once动作吗?

还是最佳实践只是添加角色,然后多次使用add_cap()?即使那样,我仍然认为add_cap正在访问数据库。

仅考虑减少不必要的数据库访问的最佳方法。您的最佳做法是什么?


太棒了!谢谢你这个问题.. 只是添加remove_role()功能之前add_role()帮助我。
beytarovski

Answers:


10

用户角色和功能已保存在数据库中,因此一旦您使用add_role()了已保存的角色,然后下次加载,WordPress将像内置角色一样知道该角色。

现在,如果您add_role()更具体地看一下第141行的功能您将看到,只有在var $use_db设置为true(默认为他)时,它才将角色和功能保存在数据库中,因此您可以在调用之前简单地对其进行更改add_role()功能和角色将不会保存。

尝试:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

更新:

如果它在测试/开发环境中,那么我看不到任何缺点,但是如果您处于实时环境中,那么可以节省在每次加载时创建角色所需的时间。

至于最佳实践,请运行一次,如果您应该在插件中使用register_activation_hook,而其他任何事情,我都使用一个简单的定制条件函数:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

糟糕 我什至从较早的WP_Roles类根源中也知道这一点。您能想到不使用数据库作为角色的任何弊端吗?是否有仅做一次操作的WP最佳实践?
汤姆·奥格

感谢您的更新-我喜欢update_option解决方案的简单性
Tom Auger

不太满意,但这似乎是最好的解决方法
Blackbam

此功能run_once在每次页面加载时增加过多的读/写数据库操作。请不要使用它。
Mayank Dudakiya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.