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

时间:2018-03-31 20:18:49

标签: excel wordpress csv 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";}}}}

1 个答案:

答案 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);