user_has_cap хук-фільтрWP 2.0.0

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

Цей хук також працюватиме і для неавторизованих користувачів. Права перевіряються і для них, лише за умовчанням у списку прав неавторизованих користувачів порожньо, але ми можемо і їм дозволити виконувати якісь дії. Кейс коли це може стати в нагоді див. у прикладі .

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

add_filter( 'user_has_cap', 'wp_kama_user_has_cap_filter', 10, 4);

/**
 * Function for `user_has_cap` filter-hook.
 *
 * @param bool[] $allcaps Array of key/value pairs where keys represent a capability name і boolean values ​​represent whether the user has that capability.
 * @param string[] $caps Потрібні primitive capabilities for the requested capability.
 * @param array $args Arguments that accompany the requested capability check.
 * @param WP_User $user The user object.
 *
 * @return bool[]
 */
function wp_kama_user_has_cap_filter( $allcaps, $caps, $args, $user ){

	// Filter...
	return $allcaps;
}
$allcaps
(масив)

Масив усіх можливостей користувача.

Масив пар ключ => значение, де ключі представляють ім’я можливості, а логічне значення true/false показує, чи має користувач цю можливість.

$caps
(масив)
Примітивні права для можливості, що запитується. Те, що повертає
map_meta_cap() .
$args
(масив)
Додаткові параметри передані в
current_user_can() або
WP_User::has_cap() , зазвичай це ID об’єкта (поста/коменту/користувача).
$user
(WP_User)
Об’єкт користувача, права якого фільтруються.

Приклади

0

#1 Додамо назви прав до списку прав користувачів на льоту

Зазвичай права ролям виставляються під час реєстрації ролі, а додаткові права окремим користувачам можна додати з допомогою плагіна User Role Editor . Однак у цьому випадку дані додаються до Бази даних, але це завжди зручно – іноді потрібна динаміка.

Іноді зручніше виставляти права на роль нальоту. Наприклад на новому проекті, де права постійно додаються/видаляються в міру зростання проекту і оновлювати права в базі незручно. А тут, вніс редагування в код і відразу результат.

Розглянемо, як це зробити через хук user_has_cap на простому прикладі. Він показує, як додати право some_capabilityкористувачеві з ID 5:

add_filter( 'user_has_cap', 'maybe_grant_some_capability_cap', 1, 4);

function maybe_grant_some_capability_cap( $allcaps, $caps, $args, $user ){

	if ( 5 === $user->ID ) {
		$allcaps['some_capability'] = true;
	}

	return $allcaps;
}

Розглянемо ще один приклад складніше. Цей приклад перевірять роль поточного користувача і додає нові права (можливості) до списку прав користувача, залежно від поточної ролі користувача (назва ролі користувача зберігається у загальному списку прав пользователя).

add_filter( 'user_has_cap', 'kama_user_has_cap', 10, 4);

/**
 * Змінює можливості ролей "на льоту".
 *
 * @param array $allcaps
 * @param array $caps
 * @param array $args
 * @param WP_User $user
 *
 * @return array
 */
function kama_user_has_cap( $allcaps, $caps, $args, $user ) {

	// Трекер (непідтверджений)
	$role = 'project_tracker_fake';
	if ( ! empty( $allcaps[ $role ] ) ) {
		// WordPress
		$allcaps['read'] = true;
	}

	// Керівник
	$role = 'project_leader';
	if ( ! empty( $allcaps[ $role ] ) ) {
		// WordPress
		$allcaps['read'] = true;
		$allcaps['edit_posts'] = true;
		$allcaps['edit_published_posts'] = true;

		// + Експерт
		$allcaps['view_expert_note'] = true; // Бачити метабокс Експерта
		$allcaps['view_expert_comment'] = true; // Бачити коментар Експерта

		// + Модератор
		$allcaps['view_moderator_note'] = true; // Бачити метабокс Модератора
	}

	// Трекер
	$role = 'project_tracker';
	if ( ! empty( $allcaps[ $role ] ) ) {
		// WordPress
		$allcaps['read'] = true;
		$allcaps['edit_posts'] = true;
		$allcaps['edit_published_posts'] = true;

		// Загальне
		$allcaps['view_post_contacts'] = true; // Бачити метабокс із контактами

		// + Експерт
		$allcaps['view_expert_note'] = true; // Бачити метабокс Експерта
		$allcaps['view_expert_comment'] = true; // Бачити коментар Експерта
		$allcaps['view_expert_rating'] = true; // Бачити оцінку Експерта

		// + Модератор
		$allcaps['view_moderator_note'] = true; // Бачити метабокс Модератора
	}

	// Експерт
	$role = 'project_expert';
	if ( ! empty( $allcaps[ $role ] ) ) {
		// WordPress
		$allcaps['read'] = true;
		$allcaps['edit_posts'] = true;
		$allcaps['delete_others_posts'] = false;
		$allcaps['edit_others_posts'] = true;

		// Загальне
		$allcaps['view_post_contacts'] = true; // Бачити метабокс із контактами

		// + Модератор
		$allcaps['view_moderator_note'] = true; // Бачити метабокс Модератора

		// Особисте
		$allcaps['view_expert_note'] = true; // Бачити метабокс Експерта
		$allcaps['view_expert_comment'] = true; // Бачити коментар Експерта
		$allcaps['view_expert_rating'] = true; // Бачити оцінку Експерта
		$allcaps['add_expert_note'] = true; // Змінювати метабокс Експерта
		$allcaps['add_expert_comment'] = true; // Змінювати коментар Експерта
		$allcaps['add_expert_rating'] = true; // Змінювати оцінку Експерта
	}

	return $allcaps;
}

Тепер можна перевірити, наприклад можливість add_expert_rating у користувача так:

if( current_user_can('add_expert_rating') ){
	echo 'Право є.';
}

0

#2 Дозволимо оновлювати пост не авторизованому користувачеві {#allows-for-unauthorized}

Припустимо, у нас такий випадок, що на фронті неавторизовані користувачі можуть оновлювати якісь конкретні дані посту, наприклад, додавати мітки до нього. Для оновлення посту ми використовуємо функцію wp_update_post() .

За умовчанням ВП не дозволить це зробити неавторизованому користувачеві, але нам потрібно надати таке право. Для цього вішаємо функцію на хук user_has_capі функції додаємо право редагувати пост.

Ми не боїмося що, користувач якось зможе нашкодити, тому що ми самі встановлюємо поля, які потрібно оновити для посту і попередньо їх очищаємо.

Наприклад, на запит аякс ми приймаємо назву елемента таксономії і хочемо додати його для посту:

// ... тут код отримання GET/POST даних

// дозволяємо будь-якому користувачеві оновлювати будь-які пости (зокрема наш)
add_filter( 'user_has_cap', 'add_editor_cap_for_unauthorizes_user' );

function add_editor_cap_hb( $allcaps ){

	$allcaps['edit_posts'] = true;

	return $allcaps;
}

$post_data = [
	'ID' => 654,
	'tax_input' = [
		'tax_name' => [ 'Term Name' ],
	],
];

// оновлюємо
wp_update_post(wp_slash($post_data));

// скасовуємо дозвіл
remove_filter( 'user_has_cap', 'add_editor_cap_for_unauthorizes_user' );

// ... якийсь ще код

список змін

З версії 2.0.0Введено.
З версії 3.7.0Added the $user parameter.

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

user_has_cap

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

wp-includes/default-filters.php 671

add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1);

wp-includes/default-filters.php 672

add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1);

wp-includes/default-filters.php 673

add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4);

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

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