add_role() run only once?

时间:2011-08-11 作者:Tom Auger

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

因此,通常我会将add\\u role()放在一个加载了wp\\u的操作挂钩中。由于我正在开发中,我还在add\\u角色之前添加了一个remove\\u role(),因此我可以确定,如果我修改了大写列表,它实际上会生效。

但很明显,现在每次访问博客页面时,都会运行此功能。好的,我可以把它放在一个只管理的操作中,或者我可以在用户或工具下创建一个插件页面,在这里可以创建一次这个角色。我想我希望有一个更简单、更优雅的解决方案。

我想不会有run\\u once之类的动作吧?

或者,最佳做法是添加角色,然后多次使用add\\u cap()?即使这样,我也可以想象add\\u cap正在访问数据库。

考虑减少不必要的db访问的最佳方法。您的最佳实践是什么?

1 个回复
最合适的回答,由SO网友:Bainternet 整理而成

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

现在如果你看看函数add_role() 更具体地说at line 141 您将看到,如果var$use_db 设置为true(默认情况下为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
}

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $