Хук map_meta_cap
позволяет настраивать проверку возможностей пользователя, в зависимости от текущего действия. Этот хук используется для модификации списка примитивных прав, необходимых пользователю для выполнения определённого действия.
apply_filters( ‘map_meta_cap’, string[] $caps, string $cap, int $user_id, array $args )
map_meta_cap
срабатывает внутри функции map_meta_cap()
, которая определяет права пользователя для выполнения заданного действия. Хук может изменять или переопределять массив прав, требуемых для конкретной проверки, добавляя или убирая права в зависимости от логики.
Для использования map_meta_cap
добавьте следующий код:
add_filter('map_meta_cap', 'custom_map_meta_cap_filter', 10, 4);
/**
* Пример использования фильтра `map_meta_cap`.
*
* @param string[] $caps Список требуемых прав.
* @param string $cap Проверяемое право.
* @param int $user_id ID пользователя.
* @param array $args Дополнительные параметры.
*
* @return string[]
*/
function custom_map_meta_cap_filter($caps, $cap, $user_id, $args) {
// Ваша логика
return $caps;
}
Пример 1: Разрешение редактирования своих записей подписчику на фронтенде
Этот пример позволяет подписчикам редактировать собственные записи, если с момента их публикации прошло не более двух месяцев.
! is_admin() && add_filter('map_meta_cap', 'allow_subscribers_edit_self_posts', 10, 4);
function allow_subscribers_edit_self_posts($caps, $cap, $user_id, $args) {
if ($cap === 'edit_post' && $caps[0] === 'edit_published_posts') {
$post = get_post($args[0]);
if (
$post->post_author == $user_id &&
get_userdata($user_id)->roles[0] === 'subscriber' &&
(time() < (MONTH_IN_SECONDS * 2 + strtotime($post->post_date_gmt)))
) {
$caps[0] = 'read';
}
}
return $caps;
}
В этом примере подписчики смогут редактировать только свои записи и только в течение двух месяцев с момента публикации.
Пример 2: Запрет удаления комментариев пользователями с ролью «Автор» на страницах
Этот пример ограничивает пользователей с ролью «Автор» от удаления комментариев на страницах (post_type page
), даже если они их авторы.
add_filter('map_meta_cap', 'restrict_author_delete_comments', 10, 4);
function restrict_author_delete_comments($caps, $cap, $user_id, $args) {
if ($cap === 'delete_comment' && user_can($user_id, 'author')) {
$comment = get_comment($args[0]);
$post_type = get_post_type($comment->comment_post_ID);
if ($post_type === 'page') {
$caps[] = 'do_not_allow';
}
}
return $caps;
}
Таким образом, пользователи с ролью «Автор» не смогут удалять комментарии на страницах, хотя на других типах записей эта возможность у них остаётся.
Пример 3: Ограничение публикации контента для роли «Редактор» в определенные дни недели
Этот пример запрещает пользователям с ролью «Редактор» публиковать новый контент по выходным, чтобы они могли делать это только в будние дни.
add_filter('map_meta_cap', 'restrict_editor_publish_on_weekends', 10, 4);
function restrict_editor_publish_on_weekends($caps, $cap, $user_id, $args) {
if ($cap === 'publish_posts' && user_can($user_id, 'editor')) {
$current_day = date('N'); // 6 и 7 соответствуют субботе и воскресенью
if ($current_day >= 6) {
$caps[] = 'do_not_allow';
}
}
return $caps;
}
Здесь «Редакторам» запрещено публиковать контент по субботам и воскресеньям, что позволяет соблюдать график публикации.
Пример 4: Полный запрет доступа к кастомайзеру для всех пользователей
Этот пример демонстрирует, как запретить доступ к кастомайзеру для всех, включая супер-администратора, вернув do_not_allow
.
add_filter('map_meta_cap', 'remove_customize_capability', 10, 2);
function remove_customize_capability($caps, $cap) {
return ($cap === 'customize') ? ['do_not_allow'] : $caps;
}
Таким образом, даже супер-администраторы не смогут получить доступ к кастомайзеру, так как возвращается специальный элемент 'do_not_allow'
, который блокирует доступ.
Заключение
Хук map_meta_cap
позволяет глубоко настраивать систему прав WordPress, обеспечивая контроль над доступом к определённым действиям в зависимости от контекста.