如何在WordPress后台按页面slug对非管理员隐藏指定页面
原代码问题
- CSS语法不合法:不存在
slug ==> 'xxx'这种CSS选择器规则,浏览器无法识别该写法,所以样式不会生效。 - 隐藏逻辑不严谨:仅通过CSS隐藏属于前端屏蔽,非管理员用户只要知道页面编辑的直接URL,仍然可以进入页面修改内容,安全性不足。
- 权限判断不合理:直接判断用户名是否为
admin不够通用,修改管理员用户名后规则就会失效,推荐用WordPress原生权限校验判断。
最优解决方案
通过WordPress原生查询钩子从后端过滤页面,从根源上隐藏指定slug的页面,代码添加到主题functions.php文件即可生效:
add_action('pre_get_posts', 'hide_specified_pages_for_non_admin'); function hide_specified_pages_for_non_admin($query) { // 仅在后台页面列表的主查询中生效 if (is_admin() && $query->is_main_query() && get_current_screen()->id === 'edit-page') { $current_user = wp_get_current_user(); // 判断用户是否没有管理员权限,可根据需求调整权限规则 if (!user_can($current_user, 'manage_options')) { // 填入需要隐藏的页面slug $hidden_slugs = ['products', 'policy', 'services']; $query->set('post_name__not_in', $hidden_slugs); } } } // 额外防护:禁止非管理员直接通过URL访问隐藏页面的编辑页 add_action('current_screen', 'block_hidden_page_edit_for_non_admin'); function block_hidden_page_edit_for_non_admin() { $screen = get_current_screen(); if (is_admin() && $screen->id === 'page' && !$screen->action === 'add') { global $post; if (!$post) return; $current_user = wp_get_current_user(); if (!user_can($current_user, 'manage_options')) { $hidden_slugs = ['products', 'policy', 'services']; if (in_array($post->post_name, $hidden_slugs)) { wp_redirect(admin_url('edit.php?post_type=page')); exit; } } } }
该方案完全通过slug匹配页面,不需要手动查询页面ID,适配主题自动部署的需求,同时从后端层面做了双重校验,安全性更高。
简化CSS方案(不推荐)
如果仅需要前端列表隐藏,不需要严格的权限控制,可以用修正后的CSS方案:
add_action('admin_head', 'hide_posts_pages_by_css'); function hide_posts_pages_by_css() { $current_user = wp_get_current_user(); if (!user_can($current_user, 'manage_options')) { ?> <style> .post-type-page.post-products, .post-type-page.post-policy, .post-type-page.post-services { display: none; } </style> <?php } }
内容的提问来源于stack exchange,提问作者ShrockCo
相关产品推荐
相关产品推荐

