Функция map_meta_cap() в WordPress: простое объяснение
Что такое map_meta_cap()?
map_meta_cap() — это функция WordPress, которая помогает преобразовать "мета-возможности" (мета-капации) в более простые (примитивные) возможности. Это позволяет системе понять, какие возможности нужны пользователю для выполнения определённых действий, например, редактирования постов или страниц.
Метавозможности и примитивные возможности
- Метавозможности — это более конкретные возможности, такие как
edit_post(редактировать пост) илиedit_user(редактировать пользователя). - Примитивные воз��ожности — это более широкие категории, такие как
edit_posts(редактировать посты) илиedit_others_posts(редактировать посты других пользователей).
Пример использования
Вот несколько примеров, как использовать map_meta_cap():
$is = map_meta_cap('edit_post', $user->ID, $post->ID);
print_r($is); // Выводит массив примитивных возможностей
Другие примеры:
map_meta_cap('edit_posts', $user->ID);
map_meta_cap('edit_post', $user->ID, $post->ID);
map_meta_cap('edit_post_meta', $user->ID, $post->ID, $meta_key);
Функция не проверяет, есть ли у пользователя необходимые возможности, она просто возвращает, какие возможности ему нужны.
Хуки из функции
Функция map_meta_cap() поддерживает несколько хуков, которые позволяют разработчикам добавлять свои условия:
auth_(object_type)_meta_(meta_key)_for_(object_subtype)auth_(object_type)_meta_(meta_key)auth_(object_type)_(object_subtype)_meta_(meta_key)map_meta_cap
Возвращаемое значение
Функция возвращает массив строк, который содержит примитивные возможности, необходимые пользователю.
Использование функции
Функция принимает следующие параметры:
map_meta_cap( $cap, $user_id, ...$args );
$cap(строка) — возможность, которую мы проверяем.$user_id(целое число) — ID пользователя, для которого проверяем возможность....$args(дополнительные параметры) — дополнительные параметры, обычно начинающиеся с ID объекта.
Пример: Проверка возможности редактирования поста
Допустим, вы хотите проверить, может ли пользователь редактировать конкретный пост:
$is = map_meta_cap('edit_post', 1, 119); // ID пользователя: 1, ID поста: 119
if (get_userdata(1)->has_cap(array_shift($is))) {
// Пользователь 1 может редактировать пост 119
}
В этом примере мы проверяем, может ли пользователь с ID 1 редактировать пост с ID 119.
Важные примечания
- Переменная
$post_type_meta_caps— глобальный массив, который используется для получения мета-возможностей типа поста. - В WordPress существует множество возможностей, каждая из которых имеет свои правила.
Изменения в функции
Следующие изменения были внесены в map_meta_cap():
- С версии 2.0.0 — функция была введена.
- С версии 4.9.6 — добавлены новые возможности, такие как
export_others_personal_data. - С версии 5.1.0 — добавлена возможность
update_php. - С версии 6.7.0 — добавлена возможность
edit_block_binding.
Код функции map_meta_cap
Вот основные части кода функции:
function map_meta_cap( $cap, $user_id, ...$args ) {
$caps = array();
// Логика определения необходимых во��можностей
switch ( $cap ) {
// Примеры возможностей...
case 'edit_post':
// Проверки и условия
break;
// Дополнительные возможности
}
return apply_filters('map_meta_cap', $caps, $cap, $user_id, $args);
}
Эта функция является важным инструментом для управления возможностями пользователей в WordPress и помогает обеспечить безопасность и контроль над действиями пользователей.