You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress:限制后台作者仅查看自身及含特定自定义字段的文章

解决WordPress多作者网站文章权限过滤问题

需求说明

多作者网站中,普通作者在后台编辑页面仅能查看两类movie自定义文章类型的内容:

  • 自己发布的文章
  • 包含自定义字段movie_multi_author且值为1的文章

原代码问题分析

你修改后的代码存在两个核心问题:

  1. 错误获取元数据:在pre_get_posts钩子阶段,还未加载单个文章对象,无法通过$post->ID调用get_post_meta获取字段值,这会导致$moviePublic始终为空
  2. 逻辑判断错误:原条件!current_user_can('edit_user', $user_id ) && $moviePublic == 1会让权限限制仅在moviePublic=1时生效,完全违背需求逻辑,同时$user_id变量未定义也会引发报错

修正后的代码

function pposts_for_current_author($query) {
    global $pagenow, $post_type;
    $current_user = wp_get_current_user();

    // 仅在后台编辑页、针对movie文章类型生效
    if ('movie' !== $post_type || 'edit.php' !== $pagenow || !$query->is_admin) {
        return $query;
    }

    // 管理员/拥有编辑所有用户权限的角色不受限制
    if (current_user_can('edit_users')) {
        return $query;
    }

    // 构建OR查询条件:作者是当前用户 或 自定义字段movie_multi_author=1
    $meta_query = array(
        'relation' => 'OR',
        array(
            'key'     => 'movie_multi_author',
            'value'   => '1',
            'compare' => '=',
        )
    );

    // 设置查询参数:当前作者 + 元数据条件
    $query->set('author', $current_user->ID);
    $query->set('meta_query', $meta_query);

    return $query;
}
add_filter('pre_get_posts', 'pposts_for_current_author');

关键修正点

  • 精准触发条件:严格限定只在后台edit.php页面、针对movie文章类型执行过滤,避免影响其他页面的正常查询
  • 正确权限判断:用current_user_can('edit_users')直接识别管理员级用户,避免原代码中未定义变量的错误
  • 元查询实现OR逻辑:通过WordPress原生的meta_query构建复合条件,这是列表页查询阶段实现多条件过滤的标准方式,替代错误的单篇文章元数据获取方式
  • 规范用户对象使用:直接调用wp_get_current_user()获取当前用户信息,避免滥用全局变量

内容的提问来源于stack exchange,提问作者Ahmad Karimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:32