Как разрешить редактору редактировать только страницу/настройки конфиденциальности?


В моей установке 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/

Другой вид обходной путь - просто выбрать "нет страницы конфиденциальности" в настройках конфиденциальности.

Author: André Kelling, 2018-11-08

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;
}
 14
Author: Sven, 2020-05-13 14:37:35

Спасибо @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), которая приводит к этой ошибке, но если кто-то получит ту же ошибку, вот решение.

 1
Author: Nicolas Prigent, 2020-03-02 15:15:33