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
相关产品推荐
相关产品推荐

