如何允许编辑人员仅编辑隐私页面/设置?

时间:2018-11-08 作者:André Kelling

在我的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/

另一种解决方法是在“隐私设置”中选择“无隐私”页面。

3 个回复
最合适的回答,由SO网友:Sven 整理而成

编辑隐私策略页面仅限于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 ) );
}
允许用户使用角色editoradministrator谁可以编辑页面(在单个和多站点实例中)要编辑和删除隐私策略页面,必须覆盖$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;
}
更新:允许具有该角色的用户editoradministrator 要编辑和删除隐私策略页面(在多站点实例中,默认情况下无法执行此操作):

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

SO网友:Nicolas Prigent

感谢@Sven提供了很好的解决方案,它工作得很好,但当用户尚未登录时,我遇到了一个问题,map\\u meta\\u cap操作无论如何都会被触发,这导致了“502 bad getaway”错误。我添加了一个is_user_logged_in() 在进行类似测试之前:

if (is_user_logged_in()){
    add_action(\'map_meta_cap\', \'custom_manage_privacy_options\', 1, 4);
}
可能是我的服务器配置(nginx)导致了这个错误,但如果有人遇到同样的错误,这里有一个解决方案。

SO网友:Preguntón

提供的答案起到了作用。但是,这一行:

if (array_intersect([\'editor\', \'administrator\'], $user_meta->roles)) {
正在生成此错误:

array_intersect(): Expected parameter 2 to be an array, null given in
因此,我对代码进行了一些调整,以确保这两个值都是有效的数组(完整代码):

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;

$target_roles = array(\'editor\', \'administrator\');
$user_meta = get_userdata($user_id);
$user_roles = ( array ) $user_meta->roles;

if ( array_intersect($target_roles, $user_roles) ) {
    if (\'manage_privacy_options\' === $cap) {
        $manage_name = is_multisite() ? \'manage_network\' : \'manage_options\';
        $caps = array_diff($caps, [ $manage_name ]);
    }
}

return $caps;
}

结束

相关推荐

Privacy in WordPress

我想用WordPress建立一个私人社区。要求如下:用户可以在某个地方“注册”,管理员会“批准”他们,用户会收到一封电子邮件“您已被批准”,然后用户可以登录并访问该网站,并可以发布帖子和回复内容,一些插件可以帮助实现这一点:Private, Private WP, User Roles, 但没有任何组合能产生我想要的。有没有办法用WordPress做到这一点?