WordPress自定义PHP函数:XML多节点存入用户元字段失败求助
问题分析与解决方案
嘿,我看了你的问题和代码,发现几个关键问题导致数据没法写入wp_usermeta,咱们一步步来梳理修复:
首先,先明确你的需求:你有一组带多个<Data>节点的XML,想用WP All Import自动把这些节点里的字段存入用户自定义元数据,而不是手动分配每个节点。但你写的钩子函数有几个致命的问题,再加上没利用好WP All Import提供的钩子参数,所以才会失败。
先看你原代码的问题
- 变量未定义:你的函数里
$data和$post_id完全没声明,PHP根本不知道这些变量从哪来,这是最核心的错误。 - 用错了函数:你说要写入
wp_usermeta,但原代码用了update_post_meta(这是写文章元数据的函数),应该用update_user_meta才对。 - 没获取XML数据:你没有从WP All Import的钩子中获取原始的XML内容,自然没法遍历
<Data>节点。
修正后的完整代码
前提说明
假设你在WP All Import的导入配置中,已经把当前导入的内容和某个用户关联起来了(比如通过XML里的某个字段匹配了用户ID,并且把用户ID存在了文章的元数据里,键名是_imported_user_id——你可以根据自己的实际映射情况修改这个键名)。
add_action('pmxi_saved_post', 'save_xml_data_to_usermeta', 10, 3); function save_xml_data_to_usermeta($post_id, $xml, $update) { // 第一步:获取当前导入对应的用户ID $user_id = get_post_meta($post_id, '_imported_user_id', true); if (empty($user_id)) { // 如果没找到用户ID,直接退出,避免报错 return; } // 第二步:从XML中提取所有<Data>节点 $data_nodes = $xml->xpath('//Data'); if (empty($data_nodes)) { return; } // 第三步:遍历每个<Data>节点,写入用户元数据 foreach ($data_nodes as $data_node) { // 用日期字段作为元数据键的前缀,避免不同Data节点的字段重复 $raw_date = (string)$data_node->DATE_FIELD; // 把日期里的点换成下划线,符合WordPress元数据键的命名规范 $clean_date = str_replace('.', '_', $raw_date); // 遍历当前Data节点下的所有字段 foreach ($data_node as $field_name => $field_value) { // 生成唯一的元数据键,比如:data_11_07_2018_FOURTH_AVG $meta_key = "data_{$clean_date}_{$field_name}"; // 把XML节点值转成字符串 $meta_value = (string)$field_value; // 只写入非空的字段(可选,根据你的需求调整) if (!empty($meta_value)) { update_user_meta($user_id, $meta_key, $meta_value); } } } }
如果是要写入文章元数据(wp_postmeta)
如果你其实是想把数据存到文章的自定义字段里,只需要把上面代码中的update_user_meta换成update_post_meta,并且去掉获取用户ID的部分:
add_action('pmxi_saved_post', 'save_xml_data_to_postmeta', 10, 3); function save_xml_data_to_postmeta($post_id, $xml, $update) { $data_nodes = $xml->xpath('//Data'); if (empty($data_nodes)) return; foreach ($data_nodes as $data_node) { $raw_date = (string)$data_node->DATE_FIELD; $clean_date = str_replace('.', '_', $raw_date); foreach ($data_node as $field_name => $field_value) { $meta_key = "data_{$clean_date}_{$field_name}"; $meta_value = (string)$field_value; if (!empty($meta_value)) { update_post_meta($post_id, $meta_key, $meta_value); } } } }
额外注意事项
- 函数加载位置:你可以把这段代码放到当前主题的
functions.php文件里,或者在WP All Import的「Function Editor」中添加。 - XML命名空间:如果你的XML带有命名空间,需要调整
xpath的查询语句(比如加上命名空间前缀)。 - 元数据键命名:如果你不想用日期作为前缀,也可以用节点的索引(比如
data_0_SUM_AVG)来区分不同的Data节点,只需要把$clean_date换成$index即可(记得在foreach里声明$index)。
内容的提问来源于stack exchange,提问作者GabiJ
相关产品推荐
相关产品推荐

