Question

Je suis en train d'obtenir une liste de rôles et de les filtrer par une capacité spécifique (personnalisée). J'ai couru à travers ce message , mais je voudrais filtrer les rôles selon qu'ils sont capables, disons, edit_post.

-Zack

Était-ce utile?

La solution

Non testé, mais devrait être facilement extensible (ou quelque chose que vous pouvez prendre des idées de).

function roles_have_cap( $roles = false, $cap ) {
    global $wp_roles;

    if( !isset( $wp_roles ) || !isset( $cap ) )
        return false;

    if( !$roles )
        $roles = array_keys( $wp_roles->roles );

    if( !is_array( $roles ) )
        $roles = array( $roles );

    $hascap = array();
    foreach( $roles as $role ) {
        if( !isset( $wp_roles->roles[$role]['capabilities'][$cap] ) || ( 1 != $wp_roles->roles[$role]['capabilities'][$cap] ) )
            continue;

        $hascap[] = $role;
    }

    if( empty( $hascap ) )
        return false;

    return $hascap;
}
  • Le premier argument prend un nom de rôle singulier (chaîne) ou un tableau de rôles pour vérifier ont un plafond particulier.
  • Le deuxième argument prend une capacité unique pour vérifier (string).

Exemple d'utilisation:

$role_can_edit_pages = roles_have_cap( 'administrator', 'edit_pages' ); 
// Result
// array( 0 => administrator )

Si la fonction retourne faux que vous sauriez le rôle (s) n'a pas le bouchon, soit ..

if( !$role_can_edit_pages )
// Role cannot not edit pages

Sinon, le résultat est un tableau de rôles qui ont le plafond (si vous avez passé dans un seul rôle ou plusieurs).

Vous pouvez couper vers le bas et juste une valeur de retour si c'est préféré, mais vous avez mentionné vouloir une liste des rôles qui ont un plafond, donc je suppose naturellement un tableau serait un choix logique ..

Conversion d'un tableau à une chaîne est assez facile, et vous pouvez même utiliser votre propre seperator, il suffit d'appeler implode(), comme si ... (en utilisant la variable exemple du début) ..

echo implode( ' | ', $role_can_edit_pages ); // | (pipe is the example seperator here)

Vous pouvez également déplacer le imploser dans la fonction pour éviter de devoir faire implose lorsque vous appelez la fonction, et ne note imploser va fonctionner correctement sur un seul élément du tableau à (ie., Vous obtiendrez une chaîne sans seperator) .

J'espère que cela vous anycase ... dans:)

EDIT: Fonction cherchera maintenant à tous les rôles si le premier arg (rôles $) est définie sur false.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top