使用自定义元动态定价规则导入WooCommerce产品



我有一个包含数量和价格列的 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";}}}}

这些值在导入时被双重序列化。这是WordPress中的设计使然。保存帖子或对象元时,WordPress将自动序列化和取消序列化对象和数组。但是,有时开发人员(错误地)使用元数据 API 并尝试手动处理序列化。为了保持与这些开发人员及其代码的向后兼容性,元数据 API 将完全按照传入的方式返回任何序列化值。为此,存储在数据库中的值必须以s:99:"..."格式包装。

解决方法是确保WooCommerce在保存产品元时导入未序列化的值。

woocommerce_product_importer_parsed_data过滤器和maybe_unserialize函数可用于有条件地将元值反序列化为数组/对象。然后,元数据 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);

最新更新