web-dev-qa-db-fra.com

Filtrer la liste des règles en fonction d'une capacité

J'essaie d'obtenir une liste de rôles et de les filtrer selon une capacité spécifique (personnalisée). J'ai rencontré ce message , mais j'aimerais filtrer les rôles en fonction de leur capacité, par exemple, à edit_post.

-Zack

1
Zack

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

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 à vérifier pour avoir une limite particulière.
  • Le deuxième argument prend une capacité singulière pour vérifier (chaîne).

Exemple d'utilisation:

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

Si la fonction renvoyait la valeur false, vous sauriez que le ou les rôles ne disposent pas du plafond, c.-à-d.

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

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

Vous pouvez le réduire et avoir simplement une valeur de retour si c'est ce que vous préférez, mais vous avez indiqué vouloir une liste de rôles ayant une limite, donc je suppose naturellement qu'un tableau serait un choix logique.

Convertir un tableau en chaîne est assez facile, et vous pouvez même utiliser votre propre séparateur, appelez simplement implode(), comme alors ... (en utilisant la variable d'exemple de la version précédente) ..

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

Vous pouvez également déplacer l'implode dans la fonction pour éviter d'avoir à imploser lors de l'appel de la fonction. Notez que implode fonctionnera correctement sur un seul tableau d'éléments (par exemple, vous obtiendrez une chaîne sans séparateur).

J'espère que c'est utile dans tous les cas ... :)

EDIT: La fonction examinera maintenant tous les rôles si le premier argument ($ roles) est défini sur false.

3
t31os