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

如何修复Setting API表单‘选项页不在允许列表’错误?

解决WordPress设置API集成到Tabs时的「options page is not in the allowed options list」错误

这个错误的核心原因是:当你把设置表单放到Tab中时,options.php会验证当前页面是否是WordPress注册过的合法设置页面。你的代码直接在构造函数中调用页面输出方法,没有将表单页面与WordPress的页面注册机制关联,导致验证失败。

关键修正步骤

  1. 不要直接在构造函数输出页面
    原代码中__construct里直接调用$this->orang_general_settings_page()是错误的,应该通过WordPress的菜单注册钩子(如admin_menu)将页面输出逻辑绑定到合法的页面slug上。

  2. 确保设置API与页面slug一致
    add_settings_section、add_settings_field、do_settings_sections中的页面参数(即orange_general_custom_page)必须和你注册的Tab页面slug完全匹配。

  3. 在admin_init中完成所有设置注册
    原代码里在页面输出时才添加设置节和字段,这不符合WordPress设置API的规范,应该将这些注册逻辑放到admin_init触发的方法中。

修正后的完整代码

class GeneralTab {       
    public function __construct() {   
        add_action('admin_init', [$this, 'orange_general_settings']);
        add_action('admin_menu', [$this, 'register_tab_page']);
    }

    // 注册Tab对应的页面
    public function register_tab_page() {
        // 替换"orange-main-settings"为你的主菜单slug
        add_submenu_page(
            'orange-main-settings',
            '通用设置',
            '通用',
            'manage_options',
            'orange_general_custom_page', // 此slug需与设置API中的page参数一致
            [$this, 'orang_general_settings_page']
        );
    }
     
    public function orang_general_settings_page() {
        // 权限校验
        if (!current_user_can('manage_options')) {
            wp_die(__('你没有足够权限访问此页面。'));
        }

        echo '<div class="wrap">';
        echo '<h2>通用设置</h2>';
        echo '<hr>';
        echo '<form method="post" action="options.php">';
        
        settings_fields('orange-general-setting-gp');
        do_settings_sections('orange_general_custom_page');
        submit_button('保存设置');
        
        echo '</form>';
        echo '</div>';
    }

    public function orange_general_email() {
        $value = get_option('orange_general_emailfield');
        echo '<input type="text" name="orange_general_emailfield" value="' . esc_attr($value) . '">';
    }

    public function orange_general_name() {
        $value = get_option('orange_general_namefield');
        echo '<input type="text" name="orange_general_namefield" value="' . esc_attr($value) . '">';
    }

    public function orange_general_settings() {
        // 注册设置节
        add_settings_section(
            'orang_general_custom',
            '',
            '', 
            'orange_general_custom_page'
        );

        // 注册邮箱字段
        add_settings_field(
            'orange_general_email_id',
            '发件人邮箱',
            [$this, 'orange_general_email'],
            'orange_general_custom_page',
            'orang_general_custom'
        );

        // 注册发件人名字段
        add_settings_field(
            'organge_general_from_name_id',
            '发件人名称',
            [$this, 'orange_general_name'],
            'orange_general_custom_page',
            'orang_general_custom'
        );

        // 注册设置项
        register_setting('orange-general-setting-gp', 'orange_general_emailfield');
        register_setting('orange-general-setting-gp', 'orange_general_namefield');
    }
}

// 初始化类
new GeneralTab();

额外说明

如果你的Tab是通过JavaScript实现的前端切换,需要确保表单提交时,当前页面的URL依然指向注册的orange_general_custom_page。如果前端切换导致页面slug变化,建议改用admin_post钩子处理表单提交,或者让每个Tab对应一个独立的WordPress注册页面,这样就能通过options.php的验证。

内容的提问来源于stack exchange,提问作者mikebension

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:57