WordPress自定义文章类型权限控制:如何排除管理员/编辑角色?
解决WordPress自定义文章类型History的访问权限跳转问题
直接给你修改后的代码,核心是在原有逻辑基础上,增加对管理员(Admin)和编辑(Editor)角色的权限判断,让这两类角色不受跳转限制:
add_action('template_redirect', 'restrict_history_post_access'); function restrict_history_post_access() { // 仅针对History类型的单篇文章生效 if (is_singular('History')) { global $post; $current_user = wp_get_current_user(); // 管理员或编辑直接跳过限制,不执行后续逻辑 if (current_user_can('manage_options') || current_user_can('edit_others_posts')) { return; } // 未登录用户直接跳转 if (!is_user_logged_in()) { wp_redirect(home_url('/指定跳转页面的slug/')); exit; } // 已登录但不是文章作者的用户执行跳转 if ($current_user->ID !== $post->post_author) { wp_redirect(home_url('/指定跳转页面的slug/')); exit; } } }
关键逻辑说明:
- 钩子选择:用
template_redirect是因为它在WordPress加载模板前触发,不会出现页面先加载再跳转的冗余问题,适合做权限跳转控制。 - 角色判定依据:
current_user_can('manage_options'):管理员角色默认拥有该核心权限,用它判断用户是否为管理员比直接检查角色更灵活(避免自定义角色权限冲突)。current_user_can('edit_others_posts'):编辑角色默认拥有编辑他人文章的权限,以此判断是否为编辑角色。
- 优先级处理:先检查管理员/编辑权限,符合条件直接终止函数,确保这两类角色不受任何跳转限制。
- 替换提示:把代码里的
/指定跳转页面的slug/改成你实际要跳转的页面路径,比如/unauthorized-access/。
额外注意:
- 确认自定义文章类型的slug是
History(大小写敏感,和你创建时的设置一致),如果是小写history,要同步修改代码里的is_singular参数。 - 代码可以放到当前主题的
functions.php文件,或者自定义插件中。
内容的提问来源于stack exchange,提问作者Antonely93
相关产品推荐
相关产品推荐

