我可以在查询中为一个特定的帖子类型指定POST__IN吗?

时间:2013-09-02 作者:djb

我想做这样的事

$query_args = array(
    \'post_type\' => array( \'cpt_1\', \'cpt_2\' ),
    \'post__in\' => array( 1, 3, 5, 7 )
);
其中,我可以指定中的post\\uu应用于哪个post类型。

例如,我想all 来自cpt\\u 1的帖子,但我只想要在中的post\\u中指定的cpt\\u 2帖子。是否有SQL挂钩(如posts\\U where)可以帮助我完成这一点?如果不是,我想我必须做两个查询?

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

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

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post