add_role()は1回だけ実行されますか?


11

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

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

しかし明らかに、これはブログのページがアクセスされるたびに実行されています。さて、管理者のみのアクションに入れることも、このロールを1回作成できるユーザーまたはツールの下にプラグインページを作成することもできます。もっとシンプルでエレガントなソリューションが出ることを期待していると思います。

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

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

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


驚くばかり!この質問をありがとう。ちょうど私を助けるremove_role()前に機能を追加しadd_role()ました。
ベイタロフスキー

回答:


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 );

更新:

テスト/開発環境にある場合、マイナス面はありませんが、ライブ環境にいる場合は、すべての負荷でロールを作成するのにかかる時間を節約できます。

ベストプラクティスとして1回実行する場合、プラグインで使用する必要がある場合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ソリューションのシンプルさのような
トム・オージェ

本当に満足のいくものではありませんが、それが最良の解決策のようです
👍–ブラックバム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.