如何在WooCommerce Product Feed Pro中添加嵌套产品属性
如何在WooCommerce Product Feed Pro中添加自定义嵌套产品属性(适配Marktplaats Feed)
问题背景
我用WooCommerce的Product Feed Pro插件生成Marktplaats产品Feed,插件自带的Marktplaats模板缺了必要的嵌套属性,需要生成如下结构的XML节点:
<admarkt:shippingOptions> <admarkt:shippingOption> <admarkt:shippingType>PICKUP</admarkt:shippingType> <admarkt:location>1097DN</admarkt:location> </admarkt:shippingOption> <admarkt:shippingOption> <admarkt:shippingType>SHIP</admarkt:shippingType> <admarkt:cost>695</admarkt:cost> <admarkt:time>2d-5d</admarkt:time> </admarkt:shippingOption> </admarkt:shippingOptions>
我已经通过Advanced Custom Fields(ACF)给产品加了对应的自定义字段组,子字段能在Product Feed Pro里正常显示,但不知道怎么把这些字段映射成上面的嵌套XML结构。
已尝试的方案
- 编辑PHP文件想启用
shippingOptions这类组的嵌套功能,没成功 - 试过插件里所有可视化配置选项,没找到可行方法
关键参考:插件内置嵌套组逻辑
插件本身支持内置嵌套组(比如budget),不用手动选父字段就能生成正确的XML结构,示例如下:
<admarkt:budget> <admarkt:totalBudget>20</admarkt:totalBudget> <admarkt:dailyBudget>5</admarkt:dailyBudget> <admarkt:cpc>0.09</admarkt:cpc> </admarkt:budget>
解决方案:可视化配置实现(无需改代码)
既然插件本身有处理嵌套组的逻辑,直接用可视化配置就能搞定:
步骤1:确认ACF字段结构
先确保你的ACF字段组是按嵌套逻辑建的:
- 建一个重复字段组(比如命名为
shipping_options) - 每组里包含
shipping_type、location/cost/time这些子字段(对应XML里的子节点)
步骤2:添加顶级XML容器节点
- 打开Feed编辑页面,找到「自定义字段」或「XML元素」配置区
- 添加一个顶级XML节点,命名为
admarkt:shippingOptions,类型选「容器」(对应父节点)
步骤3:映射重复字段到嵌套子节点
- 给每个
shippingOption建子容器:- 在
admarkt:shippingOptions下面加子节点admarkt:shippingOption,同样设为「容器」类型 - 依次添加
admarkt:shippingType、admarkt:location(或cost/time)这些子节点,分别映射到对应的ACF子字段
- 在
- 开启循环:在
admarkt:shippingOption节点的设置里,关联你建的ACF重复字段组,让插件自动循环生成多个shippingOption节点
步骤4:验证Feed输出
生成测试Feed,检查XML结构是否和目标示例一致,确认所有嵌套节点都正确关联了字段值
备选方案:用代码钩子实现
如果可视化配置满足不了需求,就用插件提供的钩子动态生成嵌套XML:
add_filter('woo_feed_item_value', 'custom_shipping_options_xml', 10, 3); function custom_shipping_options_xml($value, $product, $field_name) { if ($field_name === 'shipping_options') { $shipping_options = get_field('shipping_options', $product->get_id()); $xml = '<admarkt:shippingOptions>'; foreach ($shipping_options as $option) { $xml .= '<admarkt:shippingOption>'; $xml .= '<admarkt:shippingType>' . esc_xml($option['shipping_type']) . '</admarkt:shippingType>'; if (!empty($option['location'])) { $xml .= '<admarkt:location>' . esc_xml($option['location']) . '</admarkt:location>'; } if (!empty($option['cost'])) { $xml .= '<admarkt:cost>' . esc_xml($option['cost']) . '</admarkt:cost>'; } if (!empty($option['time'])) { $xml .= '<admarkt:time>' . esc_xml($option['time']) . '</admarkt:time>'; } $xml .= '</admarkt:shippingOption>'; } $xml .= '</admarkt:shippingOptions>'; return $xml; } return $value; }
把这段代码加到主题的functions.php或者自定义插件里,然后在Feed配置里加一个自定义字段,字段名设为shipping_options,就能输出需要的嵌套XML结构了。
内容的提问来源于stack exchange,提问作者VictorNorbart
相关产品推荐
相关产品推荐

