如何用PHP从XML Feed生成多个自定义元数据字段?
处理XML Feed生成多个自定义元数据的PHP方案
嘿,我懂你现在的需求——已经能搞定第一个自定义字段了,现在要把剩下5个XML字段也批量处理成元数据对吧?咱们可以用字段映射+循环的方式来写,既避免重复代码,也方便后续维护。
先看你给出的XML片段:
<menu_items type="array">
<menu_item>
<gluten_free type="boolean">false</gluten_free>18780 Gyro Wrap ...
</menu_item>
</menu_items>
假设你之前的代码大概是单独处理某个字段(比如name),类似这样:
// 假设已经解析好XML得到SimpleXMLElement对象 $menuItem = $xml->menu_items->menu_item; // 处理第一个自定义字段 update_post_meta($post_id, 'menu_item_name', (string)$menuItem->name);
优化后的批量处理方案
我们可以先定义一个XML字段与自定义元键的映射数组,然后循环遍历这个数组来批量生成元数据,代码更简洁:
// 1. 定义映射关系:XML字段名 => WordPress自定义元键 $metaFieldMap = [ 'name' => 'menu_item_name', 'id' => 'menu_item_id', 'gluten_free' => 'menu_item_gluten_free', 'vegan' => 'menu_item_vegan', 'description' => 'menu_item_description', // 补充你剩下的2个字段,比如示例中的dairy_free和price 'dairy_free' => 'menu_item_dairy_free', 'price' => 'menu_item_price' ]; // 2. 获取单个menu_item的XML对象(如果是多个item,看下面的扩展) $menuItem = $xml->menu_items->menu_item; // 3. 循环处理每个字段 foreach ($metaFieldMap as $xmlField => $metaKey) { // 根据字段类型转换值,避免类型错误 $value = match($xmlField) { // 整数类型字段 'id' => (int)$menuItem->$xmlField, // 布尔类型字段 'gluten_free', 'vegan', 'dairy_free' => (bool)$menuItem->$xmlField, // 默认转为字符串(比如描述、名称) default => (string)$menuItem->$xmlField }; // 更新/添加自定义元数据 update_post_meta($post_id, $metaKey, $value); }
处理多个menu_item的情况
因为你的XML里menu_items是数组类型,如果有多个菜品,需要先遍历所有menu_item:
// 遍历所有menu_item foreach ($xml->menu_items->menu_item as $menuItem) { // 这里先创建对应帖子或获取已有帖子ID,比如$post_id = wp_insert_post(...); // 再执行上面的字段循环处理 foreach ($metaFieldMap as $xmlField => $metaKey) { $value = match($xmlField) { 'id' => (int)$menuItem->$xmlField, 'gluten_free', 'vegan', 'dairy_free' => (bool)$menuItem->$xmlField, default => (string)$menuItem->$xmlField }; update_post_meta($post_id, $metaKey, $value); } }
额外注意事项
- 如果XML字段可能不存在(比如
description是空的),可以加个判断避免报错:foreach ($metaFieldMap as $xmlField => $metaKey) { if (!isset($menuItem->$xmlField)) { // 字段不存在时设置默认值或跳过 update_post_meta($post_id, $metaKey, ''); continue; } // 类型转换和更新代码... } - 确保你已经正确解析了XML,比如用
SimpleXMLElement:$xml = simplexml_load_file('your-feed-url.xml'); // 或者从字符串加载 $xml = new SimpleXMLElement($xmlString);
内容的提问来源于stack exchange,提问作者Taylor Latch
相关产品推荐
相关产品推荐

