web-dev-qa-db-ja.com

add_role()は一度だけ実行しますか?

ロールがすでに存在する場合、add_role()がデータベースを変更して失敗することを発見して驚きました。ここには2つの意味があります。1つは他のものよりも深刻です。1)開発中でadd_roleコードを更新する場合は、最初にremove_role()を実行する必要があります。再び。

そのため、私は通常、add_role()をwp_loadedアクションフック内に入れていました。私は開発中なので、add_roleの前にremove_role()も追加したので、キャップのリストを変更しても実際に有効になることを確認できます。

しかし、明らかにこれはブログのページがアクセスされるたびに実行されています。さて、私はそれを管理者専用のアクションに入れることもできますし、あるいはこのロールを一度作成できるUsersまたはToolsの下にプラグインページを作成することもできます。もっとシンプルでエレガントな解決策があると思います。

Run_onceのようなアクションがあるとは思いませんか。

それとも、ロールを追加してからadd_cap()を何度も使用するのがベストプラクティスですか?それでも、add_capがdbにアクセスしていると思います。

不必要なdbアクセスを減らすための最善の方法について考えているだけです。あなたのベストプラクティスは何ですか?

12
Tom Auger

ユーザーの役割と機能はデータベースに保存されるので、保存してから次にロードした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
}
9
Bainternet