我有一个包含数量和价格列的Excel文件,我用它来为插件WooCommerce Dynamic Pricing
的定价规则创建必要的输出。
我几乎已经想到这一点,但是WooCommerce导入器正在使用它自己的s:1:"...";
包装我的元值。 ...
内部是确定我的产品定价规则的正确值(具有固定价格折扣的价格范围)。如果我手动删除包装器,它的工作原理。问题是我有1500多种产品。 如何准确导入我在CSV中的值?
meta: _pricing_rules
列的输出如下所示:
a:1:{s:17:"set_9jhpu8nb76h30";a:8:{s:15:"conditions_type";s:3:"all";s:10:"conditions";a:1:{i:1;a:2:{s:4:"type";s:8:"apply_to";s:4:"args";a:1:{s:10:"applies_to";s:8:"everyone";}}}s:9:"collector";a:1:{s:4:"type";s:7:"product";}s:4:"mode";s:10:"continuous";s:9:"date_from";s:0:"";s:7:"date_to";s:0:"";s:5:"rules";a:5:{i:1;a:4:{s:4:"from";s:3:"100";s:2:"to";s:3:"249";s:4:"type";s:11:"fixed_price";s:6:"amount";s:4:"3.65";}i:2;a:4:{s:4:"from";s:3:"250";s:2:"to";s:3:"499";s:4:"type";s:11:"fixed_price";s:6:"amount";s:4:"3.55";}i:3;a:4:{s:4:"from";s:3:"500";s:2:"to";s:3:"999";s:4:"type";s:11:"fixed_price";s:6:"amount";s:4:"3.46";}i:4;a:4:{s:4:"from";s:4:"1000";s:2:"to";s:4:"2499";s:4:"type";s:11:"fixed_price";s:6:"amount";s:4:"3.36";}i:5;a:4:{s:4:"from";s:4:"2500";s:2:"to";s:0:"";s:4:"type";s:11:"fixed_price";s:6:"amount";s:4:"3.27";}}s:10:"blockrules";a:1:{i:1;a:5:{s:4:"from";s:0:"";s:6:"adjust";s:0:"";s:4:"type";s:16:"fixed_adjustment";s:6:"amount";s:0:"";s:9:"repeating";s:2:"no";}}}}
答案 0 :(得分:0)
这些值在导入时被双序列化。 This is by design in WordPress.保存帖子或对象元时,WordPress将自动对对象和数组进行序列化和反序列化。但是,有时开发人员(错误地)使用Metadata API并尝试手动处理序列化。为了保持与这些开发人员及其代码的向后兼容性,Metadata API将返回传递时的任何序列化值。要实现此目的,必须以s:99:"..."
格式包装存储在数据库中的值。
解决方法是确保WooCommerce在保存产品元数据时导入未序列化的值。
woocommerce_product_importer_parsed_data
过滤器和maybe_unserialize
函数可用于将元值有条件地反序列化为数组/对象。然后,Metadata API将存储这些字段而无需进行双序列化。
<?php
// Step through import meta fields.
// Use `maybe_unserialize` to conditionally expand any serialized
// values to their corresponding objects/arrays.
function csv_import_serialized($data, $importer) {
if (isset($data["meta_data"]) && is_array($data["meta_data"])) {
foreach (array_keys($data["meta_data"]) as $k) {
$data["meta_data"][$k]["value"] = maybe_unserialize($data["meta_data"][$k]["value"]);
}
}
return $data;
}
// Hook into the filter
add_filter("woocommerce_product_importer_parsed_data", "csv_import_serialized", 10, 2);