WordPress中Cannot redeclare function错误的解决请求
解决PHP Cannot redeclare wpb_dynamic_init()错误
问题原因
出现致命错误的核心原因是:两个插件各自包含了一份SDK的start.php文件,而该文件内的wpb_dynamic_init()全局函数没有做重复声明检查。当第二个插件加载时,这个函数已经被第一个插件定义过,PHP不允许全局函数重复声明,因此抛出错误。Logger类的单例设计仅解决了类实例重复创建的问题,无法覆盖全局函数重复声明的场景。
解决方法
方案1:给全局函数添加存在性检查(最快修复)
直接修改SDK的start.php文件,在声明函数前先检查是否已存在:
require_once dirname(__FILE__) . '/require.php'; // 先检查函数是否已定义,避免重复声明 if ( ! function_exists( 'wpb_dynamic_init' ) ) { function wpb_dynamic_init($module) { $wpb = Logger::instance($module['id'], $module['slug'], true); // $wpb->dynamic_init($module); return $wpb; } }
这样无论多少个插件包含该文件,函数只会被声明一次。
方案2:优化插件中的SDK加载逻辑
在每个插件加载SDK前,先检查核心函数是否已存在,避免重复包含start.php:
以插件一为例,修改后的代码如下(插件二做同样调整):
if ( ! function_exists( 'stp_wpb' ) ) { // Create a helper function for easy SDK access. function stp_wpb() { global $stp_wpb; if ( ! isset( $stp_wpb ) ) { // 先检查SDK核心函数是否已加载 if ( ! function_exists( 'wpb_dynamic_init' ) ) { require_once dirname(__FILE__) . '/wpb-sdk/start.php'; } $stp_wpb = wpb_dynamic_init( array( 'id' => 10, 'slug' => 'sdk-test-plugin', 'type' => 'plugin', 'public_key' => '7e240de74fb1ed08fa08d38063f6a691462a815', 'is_premium' => false, 'has_addons' => false, 'has_paid_plans' => false, 'menu' => array() ) ); } return $stp_wpb; } // Init . stp_wpb(); // Signal that SDK was initiated. do_action( 'stp_wpb_loaded' ); }
该方案减少了不必要的文件包含操作,同时避免函数重复声明。
方案3:将SDK独立为公共依赖(长期维护最优)
把SDK单独打包成一个WordPress插件或Composer包,让两个业务插件都依赖这个公共SDK。这样所有插件共用一份SDK代码,从根源上解决重复代码和重复声明的问题:
- 将SDK代码独立为一个WordPress插件
- 在业务插件中先检查公共SDK是否激活,再调用其函数
- 可添加依赖检查逻辑,提示用户先安装激活SDK插件
内容的提问来源于stack exchange,提问作者ahmedwp
相关产品推荐
相关产品推荐

