Список правил фильтрации на основе возможности
Я пытаюсь получить список ролей и отфильтровать их по определенной возможности (пользовательской). Я наткнулся на этот пост, но я хотел бы отфильтровать роли по тому, способны ли они, скажем, edit_post
.
-Зак
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.