WordPress中WooCommerce ZarinPal网关标题修改及重复选项问题
问题分析与解决办法
为啥会出现嵌套的同名选项?
你写的代码错在多套了一层数组结构:
get_option('woocommerce_WC_ZPal_settings')已经直接拿到了这个网关设置的完整数组(就是原插件输出里那串序列化内容对应的PHP数组)。- 结果你又给这个数组加了个
woocommerce_WC_ZPal_settings的键,再把这个嵌套数组存回去,导致设置值变成了['woocommerce_WC_ZPal_settings' => ['title' => 'test']]这种结构,看起来像是有两个同名选项,其实是你多套了一层不必要的层级。
正确修改网关标题的方法
先确认选项名是否正确
Woocommerce网关的设置选项名格式是woocommerce_{网关ID}_settings,你的网关类叫Woocommerce_Add_ZarinPal_Gateway,正常来说网关ID会是woocommerce_add_zarinpal_gateway,对应选项名是woocommerce_woocommerce_add_zarinpal_gateway_settings。不过从你给的原插件输出看,woocommerce_WC_ZPal_settings确实是存在的,那就先用这个选项名来改。
修正代码,去掉多余层级
直接修改原数组里的title键就行,不用多套一层:
// 获取网关的设置数组 $my_options = get_option('woocommerce_WC_ZPal_settings'); // 先判断是不是数组,避免报错 if (is_array($my_options)) { // 直接修改title值 $my_options['title'] = 'test'; // 把修改后的数组存回去 update_option('woocommerce_WC_ZPal_settings', $my_options); }
验证修改结果
改完之后用var_dump(get_option('woocommerce_WC_ZPal_settings'))查看输出,应该能看到原来的所有设置项里,title已经变成test,不会再出现嵌套的同名键了。
更规范的修改方式(推荐)
别直接操作数据库选项,用Woocommerce官方的钩子来改更稳妥:
add_filter('woocommerce_gateway_settings_WC_ZPal', 'custom_change_zarinpal_title'); function custom_change_zarinpal_title($settings) { foreach ($settings as &$field) { // 找到标题对应的设置项 if ($field['id'] === 'woocommerce_WC_ZPal_title') { // 修改默认显示的标题 $field['default'] = 'test'; } } return $settings; }
要是你能编辑网关的源代码,直接改类里的标题更简单:找到Woocommerce_Add_ZarinPal_Gateway类的构造函数,把$this->title = 'پرداخت امن زرین پال';改成$this->title = 'test';就行。
内容的提问来源于stack exchange,提问作者arena arens
相关产品推荐
相关产品推荐

