Список правил фильтрации на основе возможности


Я пытаюсь получить список ролей и отфильтровать их по определенной возможности (пользовательской). Я наткнулся на этот пост, но я хотел бы отфильтровать роли по тому, способны ли они, скажем, edit_post.

-Зак

Author: Community, 2011-02-15

1 answers

Непроверенный, но должен быть легко расширяемым (или чем-то, из чего вы можете черпать идеи).

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;
}
  • Первый аргумент принимает либо единственное имя роли (строку), либо массив ролей для проверки наличия определенной шапки.
  • Второй аргумент требует особой возможности для проверки (строка).

Пример использования:

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

Если бы функция вернула значение false, вы бы знали, что у роли(ролей) нет шапки, т.Е...

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

В противном случае результатом будет массив ролей, у которых есть ограничение (независимо от того, прошли ли вы в одной роли или в нескольких).

Вы могли бы урезать его и просто иметь возвращаемое значение, если это предпочтительнее, но вы упомянули, что хотите список ролей, у которых есть ограничение, поэтому я, естественно, предположил, что массив будет логичным выбором..

Преобразование массива в строку довольно просто, и вы даже можете использовать свой собственный разделитель, просто вызовите implode(), вот так... (используя пример переменной из предыдущего)..

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

Вы также можете переместить имплод в функцию, чтобы избежать необходимости выполнять имплоды при вызове функции, и обратите внимание, что имплод будет корректно работать с одним массивом элементов (т. Е. вы получите строку без разделителя).

Я надеюсь, что это поможет в любом случае...:)

РЕДАКТИРОВАТЬ: Функция теперь будет просматривать все роли, если для первого аргумента ($roles) установлено значение false.

 3
Author: t31os, 2011-02-15 21:25:51