WordPress循环注册自定义文章类型仅单条在管理员后台显示问题
问题根因
- 权限分配逻辑存在致命中断
你在reg_add_role_caps函数的循环中,只要任意一个agency的自定义角色不存在,就执行return直接终止整个函数运行,后续所有agency的权限分配都会被中断。你的数组顺序是comeleon在前,所以comeleon的权限能正常分配完成,到samsung的时候只要有一点异常就会终止,所以samsung的权限没分配成功,管理员自然看不到。当你删除comeleon条目后,第一个处理的就是samsung,如果角色获取失败直接return,所有权限都不会分配,自然所有自定义文章类型都不显示。 - 没有给默认超级管理员(administrator)分配自定义文章类型权限
你自定义了文章类型的capability_type,相当于给每个自定义文章类型设置了独有的权限规则,WordPress默认的超级管理员角色不会自动拥有这些自定义权限,你只给你自己创建的admin_xxx/contributor_xxx角色加了权限,没给默认管理员加,所以管理员只能看到之前可能手动加过权限的comeleon类型。
修复方案
- 把循环里的
return改成continue,避免单个角色异常中断整个流程 - 增加给默认administrator角色分配所有自定义文章类型权限的逻辑
修复后的reg_add_role_caps代码参考:
add_action("admin_init", 'reg_add_role_caps', 999); function reg_add_role_caps (){ $agencies = [ ["name" => "comeleon", "label" => "Comeleon"], ["name" => "samsung", "label" => "Samsung"], ]; // 先获取默认超级管理员角色 $admin = get_role('administrator'); foreach ($agencies as $agency) { $cptName = $agency["name"]."_annonces"; // 给超级管理员加当前自定义文章类型的所有权限 if ($admin) { $admin->add_cap("read_".$cptName); $admin->add_cap("read_private_".$cptName); $admin->add_cap("edit_".$cptName); $admin->add_cap("edit_others_".$cptName); $admin->add_cap("edit_published_".$cptName); $admin->add_cap("publish_".$cptName); $admin->add_cap("delete_others_".$cptName); $admin->add_cap("delete_private_".$cptName); $admin->add_cap("delete_published_".$cptName); } // 处理自定义admin角色 $roleAdmin = get_role("admin_".$agency["name"]); if (null === $roleAdmin) { // 改成continue,跳过当前,继续下一个agency continue; } $roleAdmin->add_cap("read"); $roleAdmin->add_cap("read_".$cptName); $roleAdmin->add_cap("read_private_".$cptName); $roleAdmin->add_cap("edit_".$cptName); $roleAdmin->add_cap("edit_others_".$cptName); $roleAdmin->add_cap("edit_published_".$cptName); $roleAdmin->add_cap("publish_".$cptName); $roleAdmin->add_cap("delete_others_".$cptName); $roleAdmin->add_cap("delete_private_".$cptName); $roleAdmin->add_cap("delete_published_".$cptName); // 处理自定义contributor角色 $roleContributor = get_role("contributor_".$agency["name"]); if (null === $roleContributor) { // 同样改成continue continue; } $roleContributor->add_cap("read"); $roleContributor->add_cap("read_".$cptName); $roleContributor->add_cap("read_private_".$cptName); $roleContributor->add_cap("edit_".$cptName); $roleContributor->add_cap("edit_published_".$cptName); $roleContributor->add_cap("publish_".$cptName); $roleContributor->add_cap("delete_private_".$cptName); $roleContributor->add_cap("delete_published_".$cptName); } }
生效操作
修改完代码后,停用再重新启用你的插件,让角色注册钩子重新执行,清除网站缓存后再登录后台查看即可。
内容的提问来源于stack exchange,提问作者Regina
相关产品推荐
相关产品推荐

