WordPress:限制后台作者仅查看自身及含特定自定义字段的文章
解决WordPress多作者网站文章权限过滤问题
需求说明
多作者网站中,普通作者在后台编辑页面仅能查看两类movie自定义文章类型的内容:
- 自己发布的文章
- 包含自定义字段
movie_multi_author且值为1的文章
原代码问题分析
你修改后的代码存在两个核心问题:
- 错误获取元数据:在
pre_get_posts钩子阶段,还未加载单个文章对象,无法通过$post->ID调用get_post_meta获取字段值,这会导致$moviePublic始终为空 - 逻辑判断错误:原条件
!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
相关产品推荐
相关产品推荐

