我需要获得一堆包含其元数据的帖子。当然,您无法通过标准的帖子查询来获取元数据,因此通常必须get_post_custom()
对每个帖子都执行一次。
我正在尝试一个自定义查询,如下所示:
$results = $wpdb->get_results("
SELECT p.ID,
p.post_title,
pm1.meta_value AS first_field,
pm2.meta_value AS second_field,
pm3.meta_value AS third_field
FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
pm1.post_id = p.ID AND
pm1.meta_key = 'first_field_key'
) LEFT JOIN $wpdb->postmeta pm2 ON (
pm2.post_id = p.ID AND
pm2.meta_key = 'second_field_key'
) LEFT JOIN $wpdb->postmeta pm3 ON (
pm3.post_id = p.ID AND
pm3.meta_key = 'third_field_key'
)
WHERE post_status = 'publish'
");
似乎可以工作。如果您以允许在同一帖子上使用多个元值的方式使用这些元字段中的任何一个,则会跳闸。我想不出要这样做的联接。
因此,问题1:是否存在联接,子查询或其他任何方式来引入多值元字段?
但是问题2:值得吗?postmeta
在使用2查询方法之前,我要添加多少个表联接?我可以在一个查询中获取所有发布数据,然后在另一个查询中获取所有相关的postmeta,然后在PHP的一个结果集中将元数据与发布数据合并。如果有可能的话,它会比单个更复杂的SQL查询更快吗?
我一直认为,“将尽可能多的工作交给数据库。” 不确定这一点!
get_posts()
,那么get_post_meta()
对于其中的每一个?@MannyFleurmond,很难找到有关WP内置缓存的硬信息,但AFAIK会根据请求缓存内容。调用服务器以获取此数据是AJAX调用,我认为没有其他东西可以在此之前获取内容。