プラグインでは、私はいくつかの機能と一緒に専用のユーザーロールを作成します。これらの機能は、editor
やadmin
などの他の役割にも割り当てる必要があります。
ロールと機能の追加にはデータベースの書き込みが含まれるため、これらの操作は一般的に「高価」と見なされ、プラグインアクティベーションフックでのみ実行することをお勧めします。私の場合、プラグインを mu-plugin としてロードする必要があるので、アクティベーションフックはありません。したがって、それらを追加しようとする前に、管理者と編集者の役割にすでに私のカスタム機能があるかどうかを確認したいと思います。
特定の役割に特定の機能があるかどうかを確認するにはどうすればよいですか。 または、あるいは:チェックを行うことはさらに「高価」ではないか?それとも私は事前のチェックなしでinit
フックからadd_cap()
への呼び出しをするべきですか?
うわー、私はそのようなバフーンのように感じます...笑。 WP_Role::has_cap
私は私の目を十分に難しい(役割)ことはできません。
$caps = array( 'cap_1', 'cap_2', 'cap_3' );
$roles = array( 'administrator', 'editor' );
foreach( $roles as $role ){
if( $role_object = get_role( $role ){
foreach( $caps as $cap ){
if( !$role_object->has_cap( $cap ){
$role_object->add_cap( $cap );
}
}
}
}
お詫び申し上げます、私の他の答えは ユーザーごと not 役割ごと でした。
あなたができることは、その役割が get_role()
を使った能力を持っているかどうかを確認することです。
get_role( 'administrator' )
は一連の機能を持つObjectを返すことがわかります。
$administrator = get_role( 'administrator' ); // Make sure role object was retrieved if( $administrator ){ //See if it's got our capability or not if( !in_array( 'my-custom-cap', $administrator->capabilities ) ){ // Wasn't there, so add it here $administrator->add_cap( 'my-custom-cap' ); } }
何らかの理由で毎回$role
オブジェクト比較を実行したくない場合は、一度定義してから update_option()
でデータベースにフラグを設定し、 get_option()
でそれをチェックすることができます。
if( get_option( 'manually_set_add_cap_admin' ) != true ){ $administrator = get_role( 'administrator' ); // Make sure role object was retrieved if( $administrator ){ //See if it's got our capability or not if( !in_array( 'my-custom-cap', $administrator->capabilities ) ){ // Wasn't there, so add it here $administrator->add_cap( 'my-custom-cap' ); update_option( 'manually_set_add_cap_admin', true ); } } }
これはあなたが追加したロールをループし、それらにすべての適切な機能を与える、もう少し長いソリューションです。ループが完了すると、チェックされたフラグが設定されるため、初回実行後にWP_Roleオブジェクトがフェッチされることはありません。
// Define flag as a variable to prevent typos, in update/get_option // or it will constantly run (I know from experience...) $flag = 'manually_added_my_custom_caps'; if( !get_option( $flag ) ){ // Our flag option wasn't set, that means this code hasn't run yet. $roles = array( 'administrator', 'editor' ); $capabilities = array( 'custom-cap-1', 'custom-cap-2' ); // Loop through each role foreach( $roles as $role ){ // Make sure we got a WP_Role object back if( $role_object = get_role( $role ) ){ // Loop through our custom capabilities foreach( $capabilities as $cap ){ // Our option flag wasn't set, but let's confirm // that the role doesn't have the cap if( !in_array( $cap, $role_object->capabilities ) ){ // Confirmed not there, add it here $role_object->add_cap( $cap ); } } } } // Our function ran, it should have set all caps to all the roles // so now our code will skip this entirely next time update_option( $flag, true ); }