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

WordPress类内静态数组无法持久存储插件数据问题

问题根源:PHP静态变量的生命周期限制

你遇到的问题其实是PHP的一个基础特性导致的——静态变量只在单个HTTP请求的生命周期内有效。

当你提交表单触发handle_post和save_settings时,当前的POST请求里,self::$init_core_plugins确实被赋值了,所以var_dump能看到正确数据。但调用self::refresh_page(应该是做了页面跳转,比如wp_redirect)之后,浏览器会发起一个新的GET请求来渲染页面,这时候整个PHP进程是重新启动的,Example类的静态变量$init_core_plugins会被重新初始化为空数组,自然就看不到之前的数据了。

静态变量不是持久存储方案,它没法在不同请求之间共享数据。

解决方案:用WordPress选项API持久化数据

你其实已经在save_settings里调用了update_option('core_plugins_settings', $core_plugins)把数据存到数据库了,这才是正确的持久化方式。接下来只需要在需要获取数据的地方,通过get_option从数据库里读取,而不是依赖静态数组。

修改你的admin_render_main_page函数:

public static function admin_render_main_page(){
    // 从WordPress选项中获取持久化的数据,第二个参数是默认值(空数组)
    $core_plugins = get_option('core_plugins_settings', []);
    echo "<pre>";
    var_dump($core_plugins);
    echo "</pre>";
}
优化:静态变量作为请求内缓存(可选)

如果在同一个请求内需要多次用到这个数据,为了避免重复查询数据库,可以把静态变量作为请求内的缓存来用:

class Example {

    // 初始化为null,表示还未从数据库读取
    private static $init_core_plugins = null;

    private static function handle_post() {
        $save_settings = filter_input( INPUT_POST, 'save_settings' );
        if ( !is_null( $save_settings ) && check_admin_referer( 'save-settings' ) ) {
            self::save_settings();
            self::refresh_page();
        }
    }

    private static function save_settings() {
        $core_plugins = filter_input( INPUT_POST, 'coreplugins', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
        if ( empty( $core_plugins ) ) {
            $core_plugins = [];
        }
        // 更新数据库选项
        update_option( 'core_plugins_settings', $core_plugins );
        // 更新当前请求内的静态缓存
        self::$init_core_plugins = $core_plugins;
        
        echo "<pre>";
        var_dump(self::$init_core_plugins);
        echo "</pre>";
    }
    
    // 新增一个获取数据的方法,优先用静态缓存,没有则从数据库读
    private static function get_core_plugins() {
        if (self::$init_core_plugins === null) {
            self::$init_core_plugins = get_option('core_plugins_settings', []);
        }
        return self::$init_core_plugins;
    }
    
    public static function admin_render_main_page(){
        $core_plugins = self::get_core_plugins();
        echo "<pre>";
        var_dump($core_plugins);
        echo "</pre>";
    }
}

这样,在同一个请求内多次调用get_core_plugins只会查一次数据库,而跨请求时依然会从数据库读取最新的持久化数据,完美解决你的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:45:28