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

Дозволяє змінити можливості користувача на основі поточних даних про права.

Хук спрацьовує наприкінці функції current_user_can() . Хук дозволяє додатково перевірити право користувача та дозволити чи заборонити виконувати поточну дію.

Використання

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

/**
 * Function for `map_meta_cap` filter-hook.
 *
 * @param string[] $caps Primitive capabilities required of the user.
 * @param string $cap Capability being checked.
 * @param int $user_id The user ID.
 * @param array $args Adds context до здатності check, типово starting with object ID.
 *
 * @return string[]
 */
function wp_kama_map_meta_cap_filter( $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 ).

Приклади

0

#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;
}
0

#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;
}

список змін

З версії 2.8.0Введено.

Де викликається хук

Де використовується хук у WordPress

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *