我可以合并两个新的WP_Query($ variable)吗?


15

我正在运行一个多站点网络,并且已经设置了一个使用swith_to_blog()的sql查询;并查询帖子。

有没有一种方法可以在新的WP_Query中声明查询,然后将该查询与另一个合并?

基本上,如果我这样做:

$number1 = new WP_Query($multisitequery);

我可以将其合并为:

$number2 = new WP_Query($normalquery);

$normalquery 在投资组合简码中保留分页,每页,摘录,标题等设置。

我希望它包括新$multisite查询中的查询帖子。

能做到吗?只是想让我免于创建全新的简码设置大声笑

提前谢谢了。罗里

编辑========

我所拥有的是:

$portfolio = array();
$portfolio = $settings;

在我的投资组合函数的下方,“在所有$ settings ['options']之后”,我有:

$portfolio_query = new WP_Query( $portfolio );

$portfolio_query页面模板上使用循环。

我想像这样添加一个额外的查询:

global $wpdb, $blog_id, $post;

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM wp_blogs ORDER BY blog_id" ) );

$globalcontainer = array();

foreach ($blogs as $blog){

   switch_to_blog($blog->blog_id);

   $globalquery = query_posts($args);

   $globalcontainer = array_merge( $globalcontainer, $globalquery );

   restore_current_blog();
}

我认为这$globalcontainer将是要合并到的数组wp_query();

因此,从理论上讲,接受您的答复,我可以简单地做到:

$mergedqueryargs = array_merge($portfolio , $globalcontainer);
$portfolio_query = new WP_query($mergedqueryargs);

正确吗?

其次,关于array_merge数组键覆盖.....我将如何停止覆盖?

Answers:


28

仅仅合并参数并不会做太多的事情,您需要合并生成的posts数组和post_count计数。这对我有用:

//setup your queries as you already do
$query1 = new WP_Query($args_for_query1);
$query2 = new WP_Query($args_for_query2);

//create new empty query and populate it with the other two
$wp_query = new WP_Query();
$wp_query->posts = array_merge( $query1->posts, $query2->posts );

//populate post_count count for the loop to work correctly
$wp_query->post_count = $query1->post_count + $query2->post_count;

这看起来不错,但是我正在寻找可以与pre_get_posts挂钩一起使用的解决方案-即,我需要修改现有的WP_Query对象。我尝试使用'$ wp_query-> init();' 而不是“ $ wp_query = new WP_Query();”,但这似乎使事情变得混乱。有什么建议?
ban-geoengineering

1
您应该添加一个不同的问题,因为答案是不同的,但是您可以使用相同的代码,但只使用query2部分,将$ wp_query对象的-> posts和-> post_count部分修改为具有pre_get_posts原始查询的总和给您和您要附加的第二个查询。
guidod 2014年

1
如何从此合并数组中删除重复项?
roshan 2015年

谢谢你 使用OR关系的meta_query存在问题。使用此技术将其拆分,从41s变为0.01s。
Craig Harshbarger '16

@ ban-geoengineering您有没有发现?我也坚持这一点。
哈维

17

我通常合并其ID数组并进行第三个查询。为了使第一组查询便宜,我仅使用fields参数返回其ID,如下所示:

//setup your queries with extra parameter fields => ids
$query1 = new WP_Query(array('fields' => 'ids','other_parameters' => 'etc'));
$query2 = new WP_Query(array('fields' => 'ids','other_parameters'=>'etc'));

//now you got post IDs in $query->posts
$allTheIDs = array_merge($query1->posts,$query2->posts);

//new query, using post__in parameter
$finalQuery = new WP_Query(array('post__in' => $allTheIDs));

希望这可以帮助

- -编辑 - -

在我回答之后,针对多站点详细信息编辑了原始问题。在多站点发布合并的情况下,此操作无效。


2
这个答案效果很好,与顶级解决方案相比,它看起来更像是骇客。大约一年前用过,现在又回来使用。谢谢。
戴维

当post_ID在多站点范围内不是唯一的(每个博客都是唯一的,但是多个帖子在网络中可以具有相同的ID)时,如何正常工作?
阿达尔

1
@Adal原始问题在我的答案之后进行了编辑,因此我的答案与单个站点范围有关。对于多站点,我从未尝试过合并查询,在这种情况下,这当然行不通,需要分别进行查询和合并。合并后,您可以尝试使用php排序功能订购它们(排序发布日期等)。
宝拉·雅尔辛

3
您可以通过'orderby' => 'post__in'在最后一个查询中使用来保留排序。
fregante

2
对于自定义帖子类型,我认为在任何情况下都需要post_type参数,即使使用id进行询问也是如此,因为默认情况下它是post_type = post @RobbTe
Bora Yalcin

4

因此,如果您有:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

我假设您在以前的某个地方定义了这些?

$multisitequery = array();
$normalquery = array();

...在这种情况下,要合并两个查询,只需array_merge()将两个数组传递给new WP_Query()

$merged_query_args = array_merge( $normalquery, $multisitequery );

$merged_query = new WP_Query( $merged_query_args );

请注意,顺序在array_merge()通话中很重要。如果两者具有相同的阵列键,则第二个阵列将覆盖第一个阵列。


感谢您的答复Chip,非常感谢。我已经对原始问题进行了编辑,以使您更好地了解自己的工作方式。的确如此,我非常感谢,我期待着其他知识的答复大声笑谢谢
罗里·罗通
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.