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

WordPress循环注册自定义文章类型仅单条在管理员后台显示问题

问题根因

  1. 权限分配逻辑存在致命中断
    你在reg_add_role_caps函数的循环中,只要任意一个agency的自定义角色不存在,就执行return直接终止整个函数运行,后续所有agency的权限分配都会被中断。你的数组顺序是comeleon在前,所以comeleon的权限能正常分配完成,到samsung的时候只要有一点异常就会终止,所以samsung的权限没分配成功,管理员自然看不到。当你删除comeleon条目后,第一个处理的就是samsung,如果角色获取失败直接return,所有权限都不会分配,自然所有自定义文章类型都不显示。
  2. 没有给默认超级管理员(administrator)分配自定义文章类型权限
    你自定义了文章类型的capability_type,相当于给每个自定义文章类型设置了独有的权限规则,WordPress默认的超级管理员角色不会自动拥有这些自定义权限,你只给你自己创建的admin_xxx/contributor_xxx角色加了权限,没给默认管理员加,所以管理员只能看到之前可能手动加过权限的comeleon类型。

修复方案

  1. 把循环里的return改成continue,避免单个角色异常中断整个流程
  2. 增加给默认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:05