So erhalten Sie die Rolle des Benutzers

15

Ich muss die mit einem Benutzer verknüpfte Rolle abrufen - nicht den "derzeit angemeldeten Benutzer".

Ich benutze Buddypress (das sollte für die Art dieser Frage nicht von Bedeutung sein) und bin auf dem bp_members()Laufenden.

Wie kann ich die Rolle des Benutzers abrufen, über den ich zu einem bestimmten Zeitpunkt in der Schleife berichte?

Vielen Dank.

frank13
quelle

Antworten:

17

Verwenden Sie die Benutzer-ID und WP_User:

$user = new WP_User( $user_id );
print wp_sprintf_l( '%l', $user->roles );

Aktualisieren

/**
 * Get user roles by user ID.
 *
 * @param  int $id
 * @return array
 */
function wpse_58916_user_roles_by_id( $id )
{
    $user = new WP_User( $id );

    if ( empty ( $user->roles ) or ! is_array( $user->roles ) )
        return array ();

    $wp_roles = new WP_Roles;
    $names    = $wp_roles->get_names();
    $out      = array ();

    foreach ( $user->roles as $role )
    {
        if ( isset ( $names[ $role ] ) )
            $out[ $role ] = $names[ $role ];
    }

    return $out;
}

Anwendungsbeispiel:

print '<pre>' 
    . htmlspecialchars( 
        print_r( wpse_58916_user_roles_by_id(1), TRUE ) 
        ) 
    . '</pre>';

Array
(
    [administrator] => Administrator
)
fuxia
quelle
Danke @toscho - es schien mir nicht das zu bringen, was ich erwartet hatte. Ich habe einen Editor, einen Leer- / Nullwert und bbp_participant. Ich hatte erwartet, Admin, Editor, Autor oder Abonnent zu sehen, da dies die einzigen Rollen sind, die wir verwenden.
Frank13
@ frank13 Siehe mein Update.
fuxia
2
Danke @toscho ... das ist viel Code, um einen Datenwert zu erhalten, von dem ich gedacht hätte, dass er leichter verfügbar wäre.
Frank13
Sehr hilfreich, danke! So traurig und verwirrend, warum Sie nicht direkter auf die Rolle des Benutzers zugreifen können. Die "Kann Benutzer" -Funktion funktioniert genau umgekehrt wie die meisten Leute es wünschen würden.
Mike
7

Wenn bp_membersein Array von WP_UserObjekten zurückgegeben wird, sollte jedes über eine Eigenschaft verfügen roles, die ein Array der Benutzerrollen enthält.

Andernfalls können Sie get_user_metafür den Schlüssel verwenden wp_capabilities, der ein Array von role => capabilityPaaren zurückgibt:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
quelle
$ rolls ist letztendlich ein Array. Ich bin auf der Suche nach der $user->IDRolle des. Nur eine Rolle, da keinem Benutzer in unserem System mehr als eine Rolle zugewiesen ist.
Frank13
$roles[0], erledigt.
Chrisguitarguy
Ok, danke @ChristopherDavis ... $ rollers [0] gibt für jeden Benutzer in der Liste
durchgehend
@chrisguitarguy funktionieren $ rolls [0] immer noch?
T.Todua
0

Soweit ich weiß, hat es sich wahrscheinlich im Laufe der Jahre geändert, jetzt ist es nicht mehr so 'wp_capabilities'. Ich habe mir die wichtigsten WP-Dateien angesehen und eine neue Lösung dafür gefunden. Hier ist der Code, den ich jetzt benutze:

global $wpdb;
$cap = get_user_meta( $wp_user_id, $wpdb->get_blog_prefix() . 'capabilities', true );

$cap dann kommt als assoziatives Array zum Beispiel:

{
    "administrator": true
}

oder

{
    "subscriber": true
}

In Ihrem Fall sollten Sie also wahrscheinlich die Schlüssel des Arrays erhalten:

$caps_array = array_keys( $cap );

und dann hol alles daraus. Ich musste sehen, ob der Benutzer die Administratorrolle hat, also überprüfte ich:

if ( is_array( $cap ) && !empty( $cap['administrator'] ) ) { return true; }

Ich hatte eine Benutzer-ID, nicht das gesamte WP_UserObjekt, und ich wollte keine Lösung verwenden, die das userObjekt erstellen würde . Wie ich überprüft habe, get_user_metageht es direkt zur Datenbank, um nach diesem genauen Parameter zu suchen. Dies sollte also die schnellste und ressourcenschonendste Route sein.

Olga Farber
quelle