我被困住了,希望你能帮助我。我正在开发一个显示WooCommerce商店的边栏小部件(我使用WooCommerce产品供应商插件,多用户商店的官方WooCommerce插件)。这些商店基本上是wcpv_product_vendors
分类学
现在,当我打开一家商店时(->打开单个术语)函数get_term_meta( term_id, \'vendor_data\', true )
工作正常,并为我的meta\\u键“vendor\\u data”提供了一个关联数组,其中包含存储在termmeta表中的所有值。
但是当我在我的widget中遍历一个商店列表时,我会调用get_term_data( id, \'vendor_data\', true)
结果是false
(我给函数的参数与shop页上的参数相同)。另一方面,如果我get_term_data( id, \'\', true)
我确实得到了我粘贴在下面的结果。为什么会这样?我如何解决这个问题,因为它也会影响原始产品供应商插件附带的小部件(由于这个问题而无法工作)。
这里是var_dump(get_term_data( id, \'\', true ))
:
array(1) { ["vendor_data"]=> array(1) { [0]=> string(369) "a:11:{s:5:"notes";s:0:"";s:4:"logo";s:5:"76052";s:7:"profile";s:63:"Description.";s:5:"email";s:16:"[email protected]";s:6:"admins";s:3:"103";s:10:"commission";i:0;s:15:"commission_type";s:5:"fixed";s:6:"paypal";s:0:"";s:20:"per_product_shipping";s:3:"yes";s:15:"enable_bookings";s:2:"no";s:14:"instant_payout";s:2:"no";}" } }
使用过滤器
var_dump( get_term_data( id, \'vendor_data\', true ))
:
bool(false)
The
meta_value
对于键
vendor_data
在内部
wp_termmeta
:
a:11:{s:5:"notes";s:0:"";s:4:"logo";s:5:"76052";s:7:"profile";s:63:"Description.";s:5:"email";s:16:"[email protected]";s:6:"admins";s:3:"103";s:10:"commission";i:0;s:15:"commission_type";s:5:"fixed";s:6:"paypal";s:0:"";s:20:"per_product_shipping";s:3:"yes";s:15:"enable_bookings";s:2:"no";s:14:"instant_payout";s:2:"no";}
EDIT:
我把问题缩小到
get_metadata
在函数结束时进行以下检查的函数:
if ( ! $meta_key ) {
return $meta_cache;
}
if ( isset($meta_cache[$meta_key]) ) {
if ( $single )
return maybe_unserialize( $meta_cache[$meta_key][0] );
else
return array_map(\'maybe_unserialize\', $meta_cache[$meta_key]);
}
这就解释了:如果meta\\u键中的“vendor\\u data”为空,则返回如上所述的2d数组。如果设置了,并且$single为true(这是因为$single是第三个参数),则返回
maybe_unserialize(..)
. 我刚回来就检查过了
$meta_cache[$meta_key][0]
如果没有unserialize函数,则结果是保存在数据库中的精确文本字符串。这意味着maybe\\u unserialize函数返回false
但是,这是功能:function maybe_unserialize( $original ) {
if ( is_serialized( $original ) ) // don\'t attempt to unserialize data that wasn\'t serialized going in
return @unserialize( $original );
return $original;
}在我看来,仅在这种情况下,此函数不可能返回false,因为1)函数在未从小部件调用时工作正常,并且数据未更改,2)如果数据未正确序列化,is\\u serialized将返回false,因此将返回原始输入(而不是false
).
请帮帮我:这是怎么回事?