我正在wordpress中构建一个函数,用于读取XML文件并将100-500个事件作为post类型导入wordpress。这些事件有大量元数据,这些元数据保存为post meta。其中一个元数据项是XML提要中每个事件的唯一(字符串)标识符。
导入程序将设置为wp\\U cron,以确保我们的数据库是最新的。
为了确保每次导入运行时都不会添加重复项,我想检查具有唯一标识符的帖子是否已经存在——如果已经存在,则更新,否则插入。
这就是wp\\u insert\\u post函数如何与post id一起工作。如果具有指定id的post已经存在,它将更新而不是插入。
我如何才能最好地实现这一点?我可以在每个条目上运行带有元查询的get\\u posts()吗?在性能方面,这是高效的还是昂贵的?它会导致多个sql查询吗?
如果您有任何关于如何进行此检查的建议,我们将不胜感激。
最合适的回答,由SO网友:geomagas 整理而成
您可以在简单性和效率之间进行选择。
运行get_posts()
对每个条目进行元查询是最简单的方法,可以完成这项工作。当然,正如您所指出的,还有性能方面的考虑。
如果您正在寻找更高效的解决方案,那么必须深入到数据库层并运行自己的解决方案SELECT
查询然后,将结果存储在关联数组中,并对照该数组检查每个条目。
如下所示:
global $wpdb; // if we\'re in a function
$q="
SELECT $wpdb->posts.ID,$wpdb->postmeta.meta_value
FROM $wpdb->posts
JOIN $wpdb->postmeta ON ($wpdb->posts.ID=$wpdb->postmeta.post_id)
WHERE $wpdb->post.post_type=\'event\' and $wpdb->postmeta.meta_name=\'xml_id\'
";
$rows=$wpdb->get_results($q,OBJECT);
$events_idx=array();
foreach($rows as $row) $events_idx[$row->meta_value]=$row->ID;
之后,检查事件是否已经存在就像
isset($events_idx[$xml_id])
. 如果它最终存在,你会用
id
提交人:
$post_id=$events_idx[$xml_id]
.