it-swarm.com.de

So überprüfen Sie, ob eine Rolle über eine bestimmte Funktion verfügt

In einem Plugin erstelle ich eine dedizierte Benutzerrolle mit einigen Funktionen. Diese Funktionen müssen auch anderen Rollen zugewiesen werden, z. B. editor und admin.

Da das Hinzufügen von Rollen und Funktionen Datenbankschreibvorgänge umfasst, werden diese Vorgänge im Allgemeinen als "teuer" angesehen und es wird empfohlen, sie nur im Plugin-Aktivierungs-Hook auszuführen. In meinem Fall gibt es keinen Aktivierungs-Hook, da das Plugin als mu-plugin geladen werden muss. Daher möchte ich überprüfen, ob die Administrator- und Editorrollen bereits über meine benutzerdefinierten Funktionen verfügen, bevor ich versuche, sie hinzuzufügen.

Wie kann ich überprüfen, ob eine bestimmte Rolle eine bestimmte Fähigkeit hat? Oder alternativ: Ist der Scheck noch günstiger? Oder sollte ich einfach den Aufruf von add_cap() über den Hook init ohne vorherige Überprüfung durchführen?

2
jsphpl

Aktualisieren:

Wow, ich fühle mich wie ein Trottel ... haha. WP_Role::has_cap

Ich kann meine Augen nicht hart genug rollen.

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

Ignorieren Sie diesen Unsinn:

Ich entschuldige mich, meine andere Antwort war pro Benutzer nicht pro Rolle .

Sie können mithilfe von get_role() überprüfen, ob die Rolle über die entsprechenden Funktionen verfügt.

Sie können sehen, dass get_role( 'administrator' ) ein Objekt zurückgibt, das eine Reihe von Funktionen enthält.

$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' );
    }
}

Wenn Sie den $role-Objektvergleich aus irgendeinem Grund nicht jedes Mal ausführen möchten, können Sie ihn einmal definieren und dann mit update_option() ein Flag in der Datenbank setzen und mit get_option() überprüfen.

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

Hier ist eine etwas längere Lösung, die alle von Ihnen hinzugefügten Rollen durchläuft und ihnen die entsprechenden Funktionen verleiht. Nach Abschluss der Schleifen wird ein Flag gesetzt, das aktiviert ist, sodass nach der ersten Ausführung kein WP_Role-Objekt abgerufen wird.

// 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 );
}
2
Xhynk