我遇到了一个案例,我还想快速检索大量带有相关元信息的帖子。我需要检索O(2000)个帖子。
我使用Otto的建议进行了尝试-为所有帖子运行WP\\u Query::Query,然后循环并为每个帖子运行get\\u post\\u custom。This took, on average, about 3 seconds to complete.
然后我尝试了Ethan的pivot查询(尽管我不喜欢手动询问我感兴趣的每个meta\\u键)。我仍然需要遍历所有检索到的帖子来取消meta\\u值的序列化。This took, on average, about 1.3 seconds to complete.
然后我尝试使用GROUP\\u CONCAT函数,并找到了最佳结果。代码如下:
global $wpdb;
$wpdb->query(\'SET SESSION group_concat_max_len = 10000\'); // necessary to get more than 1024 characters in the GROUP_CONCAT columns below
$query = "
SELECT p.*,
GROUP_CONCAT(pm.meta_key ORDER BY pm.meta_key DESC SEPARATOR \'||\') as meta_keys,
GROUP_CONCAT(pm.meta_value ORDER BY pm.meta_key DESC SEPARATOR \'||\') as meta_values
FROM $wpdb->posts p
LEFT JOIN $wpdb->postmeta pm on pm.post_id = p.ID
WHERE p.post_type = \'product\' and p.post_status = \'publish\'
GROUP BY p.ID
";
$products = $wpdb->get_results($query);
// massages the products to have a member ->meta with the unserialized values as expected
function massage($a){
$a->meta = array_combine(explode(\'||\',$a->meta_keys),array_map(\'maybe_unserialize\',explode(\'||\',$a->meta_values)));
unset($a->meta_keys);
unset($a->meta_values);
return $a;
}
$products = array_map(\'massage\',$products);
This took on average 0.7 seconds. 这大约是WP get\\u post\\u custom()解决方案的四分之一,大约是pivot查询解决方案的一半。
也许有人会对此感兴趣。