Как разрешить редактору редактировать только страницу/настройки конфиденциальности?
В моей установке WordPress (4.9.8.)
роль редактора не позволяет редактировать страницу конфиденциальности.
Это будет работать со следующими в моем functions.php
:
$role_object = get_role( 'editor' );
$role_object->add_cap( 'manage_privacy_options', true );
$role_object->add_cap( 'manage_options' ); // this needs to be active in order that before cap works
Но теперь у редактора гораздо больше прав, чем просто редактирование страницы конфиденциальности.
Есть ли другой способ grant access to the editor user role
с некоторыми строками кода PHP?
В качестве обходного пути я сейчас использую этот плагин: https://wordpress.org/plugins/manage-privacy-options/
Другой вид обходной путь - просто выбрать "нет страницы конфиденциальности" в настройках конфиденциальности.
2 answers
Редактирование страницы политики конфиденциальности ограничено manage_privacy_options
, как указано в комментарии в файле ядра WordPress wp-includes/capabilities.php
:
/*
* Setting the privacy policy page requires `manage_privacy_options`,
* so editing it should require that too.
*/
if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) {
$caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) );
}
Разрешить пользователям с ролями кто может редактировать страницы (как в одном, так и в нескольких экземплярах) для редактирования и удаления страницы политики конфиденциальности необходимо перезаписать массив editor
и administrator
$caps
:
add_action('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
function custom_manage_privacy_options($caps, $cap, $user_id, $args)
{
if (!is_user_logged_in()) return $caps;
if ('manage_privacy_options' === $cap) {
$manage_name = is_multisite() ? 'manage_network' : 'manage_options';
$caps = array_diff($caps, [ $manage_name ]);
}
return $caps;
}
Обновление: Разрешить пользователям с ролью editor
или administrator
редактировать и удалять страницу политики конфиденциальности (что невозможно по умолчанию в многосайтовых экземплярах):
add_action('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
function custom_manage_privacy_options($caps, $cap, $user_id, $args)
{
if (!is_user_logged_in()) return $caps;
$user_meta = get_userdata($user_id);
if (array_intersect(['editor', 'administrator'], $user_meta->roles)) {
if ('manage_privacy_options' === $cap) {
$manage_name = is_multisite() ? 'manage_network' : 'manage_options';
$caps = array_diff($caps, [ $manage_name ]);
}
}
return $caps;
}
Спасибо @Sven за хороший обходной путь, он работает хорошо, но у меня возникла проблема, когда пользователь еще не вошел в систему, действие map_meta_cap все равно запускается, что привело к ошибке "502 неудачного бегства". Я добавил тест is_user_logged_in()
перед тем, как сделать так:
if (is_user_logged_in()){
add_action('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
}
Возможно, это моя конфигурация сервера (nginx), которая приводит к этой ошибке, но если кто-то получит ту же ошибку, вот решение.