Get_Term_Meta在小部件中返回FALSE

时间:2016-11-14 作者:Matthias S

我被困住了,希望你能帮助我。我正在开发一个显示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)
Themeta_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).

请帮帮我:这是怎么回事?

1 个回复
最合适的回答,由SO网友:Matthias S 整理而成

找到问题。。不知何故,我的序列化字符串已损坏,当尝试在WP后端编辑数据时,它抛出了一个错误,数据被重置。Unserialize现在工作正常,一切正常。我不知道这是否可以帮助任何可能处于类似情况的人,因此我现在不删除此内容。如果国防部认为这应该删除,请随时删除它或让我知道,我会删除它自己。