我讨厌写“你做不到”的答案,但你做不到。这是你关于你是否可以用一个WP_Query
. 您不能在同一查询中使用WP_Query
(您实际上正在使用query_posts
. 请不要。它不是二次回路的正确工具。)
即使在原始SQL中,也必须编写单独的查询和UNION
them together, 这就是我的做法。
$sql = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = \'books\' AND post_status = \'publish\' LIMIT 3)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = \'magazines\' AND post_status = \'publish\' LIMIT 2)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = \'videos\' AND post_status = \'publish\' LIMIT 1)";
// be sure to add any other conditions you need
$ids = $wpdb->get_col($sql);
然后运行这些
$ids
通过一个新的
WP_Query
要获得适当循环所需的post对象。
您甚至可以将SQL分解为一个模式并重用它。类似于。。。
$sqlpat = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = \'%s\' AND post_status = \'publish\' LIMIT %d)";
$sql = \'(\'.sprintf($sqlpat,\'books\',3).\') UNION ALL (\'.sprintf($sqlpat,\'magazines\',2).\') UNION ALL (\'.sprintf($sqlpat,\'videos\',1).\')\';
假设我没有犯错误(代码没有经过测试),那么您应该拥有您想要的内容——三种post类型,每种类型都有一个特定的计数。它们可能不会按照您想要的顺序出现,因此您可能需要在PHP中对它们进行排序,或者构建更复杂的SQL查询。