問題描述

我驚訝地發現,如果角色已經存在,那麼 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。