WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Шаблоны сайтов на русском

map_meta_cap хук-фильтр . WP 2.8.0

Позволяет изменить возможности пользователя на основе текущих данных о правах.

Хук срабатывает в конце функции map_meta_cap(), которая базово определяет возможность (право) текущего пользователя выполнять указанное действие (см. current_user_can()). Хук позволяет дополнительно проверить право пользователя и разрешить или запретить выполнять текущее действие.

Использование

add_filter( 'map_meta_cap', 'filter_function_name_215', 10, 4 );
function filter_function_name_215( $caps, $cap, $user_id, $args ){
	// filter...

	return $caps;
}
$caps(массив)
Содержит массив текущих примитивных прав пользователя, которые были определены в результате проверки прав доступа, через current_user_can() или user_can() Например: array( [0] => edit_published_posts ).
$cap(строка)
Текущее название проверяемого права, например: edit_post (мета право) или edit_posts (примитивное право).
$user_id(число)
ID юзера для которого проверяется возможность.
$args(массив)

Дополнительные параметры указанные в функцию проверки права. Например тут будут содержаться все параметры, кроме первого параметра указанные в фукнции current_user_can().

Обычно этот массив содержит один элемент - ID объекта, для которого проверяется право. Например при current_user_can( 'edit_post', 123 ) этот параметр будет равен: array( [0] => 123 ).

Примеры

#1 Пример использования фильтра map_meta_cap

Этот пример показывает как можно дополнительно открыть доступ пользователя для выполнения каких-либо действий. В данном случае, открыть доступ к редактированию записи для подписчика с фронта.

Предполагается что запись можно редактировать с фронт-энда и проверка на эту возможность делается стандартно: current_user_can( 'edit_post', $post_id );

// разрешаем редактировать пост подписчику, если он автор поста и со времени публикации поста не прошло больше X месяцев
!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 ){
	// print_r( $caps );    // [0] => edit_published_posts
	// print_r( $cap );     // edit_post
	// print_r( $user_id ); // 80
	// print_r( $args );    // [0] => 913

	if( $cap === 'edit_post' && $caps[0] === 'edit_published_posts' ){
		$post = get_post( $args[0] );
		// разрешаем редактировать пост, если это автор поста и со времени публикации поста прошло не больше 2 месяца
		if( $post->post_author && $user_id == $post->post_author && 
			get_userdata($user_id)->roles[0] === 'subscriber' && 
			( time() < ( MONTH_IN_SECONDS*2 + strtotime($post->post_date_gmt) ) )
		){
			$caps[0] = 'read';
		}
	}

	return $caps;
}

#2 Разрешим определенным пользователям редактировать чужие Записи

Допустим, авторы публикуют проекты (Записи) и в метаполе указывают ID трекера (кастомная роль), который затем сможет редактировать их проекты.

add_filter( 'map_meta_cap', 'allow_tracker_edit_posts', 10, 4 );

/**
 * Разрешает Трекерам редактировать записи подопечных.
 *
 * @param array  $caps
 * @param string $cap
 * @param int    $user_id
 * @param array  $args
 *
 * @return array
 */
function allow_tracker_edit_posts( $caps, $cap, $user_id, $args ) {
	if (
		// Работаем только с нужной мета-возможностью
		$cap === 'edit_post'
		// ID текущего пользователя должен совпадать с тем, что в мете у записи
		&& (int) get_post( $args[0] )->project_tracker === $user_id
		// Роль текущего пользователя, для которого надо добавить возможность
		&& get_userdata( $user_id )->has_cap('project_tracker')
	) {
		$caps[0] = 'edit_posts'; // Добавляем фундаментальную возможность (право)
	}

	return $caps;
}

Где вызывается хук

map_meta_cap()
map_meta_cap
wp-includes/capabilities.php 608
return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args );

Где используется хук (в ядре WP)

wp-includes/class-wp-customize-manager.php 2908
add_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10, 4 );
wp-includes/class-wp-customize-manager.php 2912
remove_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10 );
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться