Функция 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_useredit_userremove_userpromote_userdelete_postedit_postread_postdelete_termedit_termassign_termactivate_plugindeactivate_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, которая позволяет динамически определять, какие права должны быть у пользователя для выполнения различных операций.