問題描述

我驚訝地發現,如果角色已經存在,那麼 add_role() 會修改數據庫並失敗。這裏有兩個含義,首先比另一個更重要:1) 如果您正在開發和更新您的 add_role 代碼,則必須先使用 remove_role() 2),否則您不應再次運行該代碼。

所以通常我一直把我的 add_role() 放在 wp_loaded 動作鈎子。而且,由於我正在開發中,我還在我的 add_role 之前添加了一個 remove_role(),所以我可以確定,如果我修改我的上限列表,它將會生效。

但是顯然,這是每次訪問博客頁面時都會運行。好的,我可以把它放在一個 admin-only 動作中,或者我可以創建一個插件頁面,可能在用户或工具下,可以創建一個這個角色。我想我希望有一個更簡單,更優雅的解決方案。

我沒想到有沒有一個 run_once 的動作呢?

還是最好的做法只是添加角色,然後再使用 add_cap() 一次?即使如此,我想象,add_cap 正在訪問數據庫。

只是考慮減少不必要的數據庫訪問的最佳方式。你最好的做法是什麼?

最佳解決方案

用户角色和功能被保存在數據庫中,所以一旦你已經使用了 add_role()它的保存,然後下一次加載 WordPress 就會知道這個角色就像內置的角色一樣。

現在,如果您更清楚地查看功能 add_role() at line 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
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。