
当WordPress插件调用get_option()未提供默认参数时,若选项尚未保存,函数将返回false而非空数组,导致后续数组键访问(如$options['site_key'])触发“Trying to access array offset on value of type bool”错误。
当wordpress插件调用`get_option()`未提供默认参数时,若选项尚未保存,函数将返回`false`而非空数组,导致后续数组键访问(如`$options['site_key']`)触发“trying to access array offset on value of type bool”错误。
该错误源于插件类 WC_Ncr_No_Captcha_Recaptcha 的 initialize() 方法中未对 get_option() 设置安全默认值:
self::$plugin_options = get_option( 'wc_ncr_options' ); // ❌ 危险:未设默认值 self::$site_key = self::$plugin_options['site_key']; // ⚠️ 当 $plugin_options === false 时崩溃
WordPress 官方文档明确指出:get_option() 在选项不存在时返回 false(而非 null 或空数组)。因此,直接将其当作数组使用会引发类型错误——尤其在启用 WP_DEBUG 后暴露为 Notice 级别警告。
✅ 正确做法是:始终为 get_option() 提供结构完整的默认数组,确保返回值类型可预期。修改 initialize() 方法如下:
public static function initialize() {
// ✅ 安全:提供完整默认配置,避免 false 值风险
$default_options = array(
'site_key' => '',
'secrete_key' => '', // 注意:原代码中字段名拼写为 'secrete_key'(应为 'secret_key',需同步修正)
'theme' => 'light',
'language' => '',
'error_message' => __( '<strong>ERROR</strong>: Please confirm you are not a robot', 'wc-no-captcha' ),
'captcha_wc_registration' => 'yes',
'captcha_wc_login' => 'no',
'captcha_wc_password_reset' => 'no',
'captcha_wc_comment' => 'yes',
);
self::$plugin_options = get_option( 'wc_ncr_options', $default_options );
// ✅ 现在可安全访问键值(即使选项未初始化)
self::$site_key = self::$plugin_options['site_key'];
self::$secret_key = self::$plugin_options['secrete_key']; // 建议后续统一字段名为 'secret_key'
self::$theme = self::$plugin_options['theme'];
self::$language = self::$plugin_options['language'];
self::$error_message = self::$plugin_options['error_message'];
// ... 其余逻辑保持不变
}
⚠️ 关键注意事项:
-
字段一致性:代码中存在
'secrete_key'(拼写错误),应与数据库存储及表单提交字段名严格一致;建议统一修正为'secret_key'并更新on_activation()中的默认值。 -
激活钩子补充:虽然
on_activation()已添加默认选项,但首次启用后若用户未进入设置页保存,get_option()仍可能因缓存或竞态返回false——因此运行时兜底默认值不可或缺。 -
类型防御增强(进阶):可进一步增加类型检查(非必需但更健壮):
self::$plugin_options = is_array( get_option( 'wc_ncr_options' ) ) ? get_option( 'wc_ncr_options' ) : $default_options;
通过为 get_option() 显式声明默认数组,不仅彻底解决当前 Notice 错误,更提升了插件鲁棒性与用户体验——无论选项是否已初始化,插件均可安全启动并降级使用合理默认值。











