WordPress как на ладони
wordpress jino

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 ).

Примеры

#2 Пример использования фильтра 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;
}

Где используется хук

map_meta_cap() остальные хуки:

Код хука-фильтра map_meta_cap

Фрагмент из: wp-includes/capabilities.php VER 4.9.7
...

		// If no meta caps match, return the original cap.
		$caps[] = $cap;
	}

	/**
	 * Filters a user's capabilities depending on specific context and/or privilege.
	 *
	 * @since 2.8.0
	 *
	 * @param array  $caps    Returns the user's actual capabilities.
	 * @param string $cap     Capability name.
	 * @param int    $user_id The user ID.
	 * @param array  $args    Adds the context to the cap. Typically the object ID.
	 */
	return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args );
}

/**
 * Whether the current user has a specific capability.
 *
 * While checking against particular roles in place of a capability is supported
 * in part, this practice is discouraged as it may produce unreliable results.
 *
 * Note: Will always return true if the current user is a super admin, unless specifically denied.
 *
 * @since 2.0.0
 *
 * @see WP_User::has_cap()
 * @see map_meta_cap()
 *
...
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться