Функция map_meta_cap()
используется для преобразования мета-прав в примитивные права, которые можно проверить у пользователя или его роли. Мета-право, например, edit_post
, относится к конкретному объекту (например, к записи) и на его основе функция возвращает набор примитивных прав, таких как edit_published_posts
или edit_others_posts
. Эти примитивные права уже можно проверить у пользователя, чтобы определить, имеет ли он доступ к запрашиваемому действию.
map_meta_cap( string $cap, int $user_id, mixed $args ): string[]
Параметры
- $cap (строка) (обязательный) — мета-возможность, которую нужно преобразовать.
- $user_id (число) (обязательный) — ID пользователя, для которого необходимо преобразовать мета-возможность.
- $args (смешанный тип) (необязательный) — дополнительные параметры, как правило, ID объекта (например, записи), для которого проверяется мета-возможность.
Возвращаемое значение
- string[] — массив примитивных возможностей, которые требуются для выполнения действия.
Пример 1: Преобразование мета-возможности edit_post
Допустим, вам нужно узнать, какие примитивные права нужны пользователю с ID 1 для редактирования записи с ID 123. Вы можете использовать map_meta_cap()
, чтобы узнать это:
$is = map_meta_cap( 'edit_post', 1, 123);
print_r( $is );
Результат может выглядеть следующим образом:
Array
(
[0] => edit_published_posts
)
В данном случае для редактирования записи пользователю необходимо право edit_published_posts
.
Теперь можно проверить, есть ли у пользователя данное право:
if ( get_userdata(1)->has_cap( array_shift($is) ) ) {
echo "Пользователь 1 может редактировать запись 123";
}
Пример 2: Проверка возможности активации плагина
Чтобы узнать, имеет ли пользователь право активировать конкретный плагин, например, my-plugin/my-plugin.php
, можно преобразовать мета-возможность activate_plugin
в примитивные права:
$capabilities = map_meta_cap( 'activate_plugin', $user->ID, 'my-plugin/my-plugin.php' );
print_r( $capabilities );
Результат может включать права, такие как activate_plugins
, которые можно проверить через current_user_can()
.
Пример 3: Проверка прав на удаление пользователя
Вы также можете проверить, какие примитивные права нужны для удаления пользователя:
$capabilities = map_meta_cap( 'delete_user', $admin->ID, $user_to_delete->ID );
print_r( $capabilities );
Результат может быть, например, delete_users
, что указывает на необходимость этого примитивного права для удаления пользователя.
Зачем использовать map_meta_cap()
?
Мета-право относится к конкретным объектам (записям, пользователям, плагинам и т.д.) и описывает действие над ними, например, редактирование или удаление. Но у пользователей и ролей в WordPress хранятся только примитивные права, такие как edit_posts
, delete_users
и т.д.
Преобразование мета-прав через map_meta_cap()
помогает определить, какие именно примитивные права требуются для выполнения действия. Это удобно, так как мета-прав очень много, и они зависят от контекста (например, права на редактирование конкретной записи).
Основные мета-права
delete_user
edit_user
remove_user
promote_user
delete_post
edit_post
read_post
delete_term
edit_term
assign_term
activate_plugin
deactivate_plugin
Расширение списка мета-прав
Список мета-прав можно расширить с помощью хуков. В функции используется фильтр map_meta_cap
, который позволяет изменять необходимые права в зависимости от задачи.
Пример использования фильтра:
add_filter( 'map_meta_cap', 'my_custom_map_meta_cap', 10, 4 );
function my_custom_map_meta_cap( $caps, $cap, $user_id, $args ) {
if ( 'edit_custom_post' === $cap ) {
// Преобразовать мета-право 'edit_custom_post' в примитивное право
$caps = array( 'edit_others_posts' );
}
return $caps;
}
Заключение
Функция map_meta_cap()
позволяет гибко преобразовывать мета-право в примитивные возможности, необходимые для выполнения конкретного действия. Это ключевая часть системы управления доступом в WordPress, которая позволяет динамически определять, какие права должны быть у пользователя для выполнения различных операций.