检查是否存在具有特定元的帖子的最佳方法

时间:2015-02-17 作者:Malibur

我正在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查询吗?

如果您有任何关于如何进行此检查的建议,我们将不胜感激。

1 个回复
最合适的回答,由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].

结束

相关推荐

CPT while loop not working

我无法从while循环中获得任何东西:<ul> <?php $query_args = array( \'post_type\' => \'Smart panels\', \'posts_per_page\' => 5, \'orderby\' => \'meta_value_num\', \'meta_key\' => \'post_v