WP_Query
如果没有很多帮助的话,他就不可能有这样的逻辑。不过,您可以做以下几件事:
只需运行两个不同的查询,每种帖子类型一个。这既简单又快速,但您的帖子不会“混合”在一起。我不知道这是否是你想要的。然后还需要两个单独的循环。我相信你可以设置它,所以我不会发布它的代码。
运行多个查询并组合它们。
$post_ids = new WP_Query(array(
// query for one post type
\'fields\' => \'ids\',
// other parameters
));
$post_ids_2 = new WP_Query(array(
// query for the others
\'fields\' => \'ids\',
// other parameters
));
// join them
$post_ids = $post_ids->posts + $post_ids_2->posts;
$posts_qry = new WP_Query(array(\'post__in\'=> $posts_ids));
这种技术存在性能问题,因为您需要运行三个查询才能使其工作。您的帖子是混合的,您可以使用一个循环来显示它们。
编写大量SQL—例如UNION
(Code stolen form another post 因此,这只是说明性的。您需要对其进行更改。)
$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);
现在有趣的部分是过滤器。您将需要
post_fields
,
posts_join
, 和
posts_where
这样做,或
posts_clauses
. 后者是迄今为止最简单的。
function post_in_one_type($clauses) {
remove_filter(\'posts_clauses\',\'post_in_one_type\');
global $wpdb;
$clauses[\'fields\'] .= \', cpt2.*\';
$clauses[\'join\'] .= ", {$wpdb->posts} as cpt2 ";
$where = preg_match(
"/ AND (.*)/",
$clauses[\'where\'],
$matches
);
$cpt2_where = str_replace($wpdb->posts,\'cpt2\',$matches[1]);
$cpt2_where = str_replace(\'cpt_1\',\'cpt_2\',$cpt2_where).\' AND cpt2.ID IN (1, 3, 5, 7) \';
$clauses[\'where\'] = \' AND (\'.$matches[1].\') || (\'.$cpt2_where.\') \';
return $clauses;
}
add_filter(\'posts_clauses\',\'post_in_one_type\');
$args = array(
\'post_type\' => array( \'cpt_1\' )
);
$q = new WP_Query($args);
var_dump($q->request);
要有效地测试这一点几乎是不可能的,因此没有承诺。我会先尝试其他解决方案,并坚持使用它们,除非你真的看到你无法承受的性能下降。
相关:https://wordpress.stackexchange.com/a/79960/21376
https://wordpress.stackexchange.com/a/79977/21376