是否可以在新的WP_Query中声明该查询并实际将该查询与另一个查询合并?
如果我这样做,基本上是这样:
$number1 = new WP_Query($multisitequery);
我可以与以下设备合并吗:
$number2 = new WP_Query($normalquery);
$normalquery
保留分页,每页,摘录,标题等...在投资组合短代码上。我希望它包含新
$multisite
查询中的查询帖子。可以实现吗?只是想让我免于创建一个全新的简码设置大声笑
非常感谢。
Rory
EDIT ========
我所拥有的是:
$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数组键覆盖.....
要停止覆盖吗?
#1 楼
仅合并参数并不会做很多事情,您需要合并生成的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;
#2 楼
我通常合并其ID数组并进行第三个查询。为了使第一组查询便宜,我只使用以下字段参数返回其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));
希望这会有所帮助
---编辑---
回答完我的原始问题,以获取多站点详细信息。如果是多站点发布合并,则此操作无效。
评论
这个答案效果很好,与顶级解决方案相比,它看起来更像是骇客。大约一年前用过,现在又回来使用。谢谢。
–戴维
17年7月5日在11:01
当post_ID在多站点范围内不是唯一的(每个博客都是唯一的,但是多个帖子在网络中可以具有相同的ID)时,如何正常工作?
–阿达尔
17-10-5在21:41
@Adal原始问题在我的答案之后进行了编辑,因此我的答案与单个站点范围有关。对于多站点,我从未尝试过合并查询,在这种情况下,这当然行不通,需要分别进行查询和合并。合并后,您可以尝试使用php排序功能订购它们(排序发布日期等)。
–博拉·雅尔辛(Bora Yalcin)
17-10-6在12:20
您可以在上一个查询中使用'orderby'=>'post__in'保留排序。
–fregante
18年2月23日在10:00
对于自定义帖子类型,我认为在任何情况下post_type参数都需要它,即使使用id进行询问,因为默认情况下它是post_type = post @RobbTe
–博拉·雅尔辛(Bora Yalcin)
19年1月15日在17:03
#3 楼
因此,如果您有以下内容:$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,非常感谢。我已经对原始问题进行了编辑,以使您更好地了解自己的工作方式。的确非常感谢,我期待其他知识的答复大声笑
–罗里·罗通(Rory Rothon)
2012年6月17日在22:17
#4 楼
因此,例如,您可以将两个具有不同post_type或其他排序数据的WP_Query查询粘合在一起,然后通过ID将它们粘合到一个可以完全起作用的WP_Query查询中-为了在粘合时保留排序,您需要指定orderby => post__in我的示例是它如何创建新的WP_Query周期,并可以通过处理需要在处理显示帖子的周期之前调用的new global_change_of_sorting_posts-> change_query_posts()=> query_posts()来影响显示帖子的其他任何周期!
class global_change_of_sorting_posts
{
public function get_posts_ids()
{
$query1 = new WP_Query([
'fields' => 'ids',
'posts_per_page' => -1,
'post_type' => 'post',
]);
$query2 = new WP_Query([
'posts_per_page' => -1,
'fields' => 'ids',
'post_type' => 'custom-post',
]);
$merge_ids_posts = $query1->posts + $query2->posts;
wp_reset_query();
return $merge_ids_posts;
}
public function get_posts_wp_query()
{
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$posts_per_page = 40;
$wp_query = new WP_Query([
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'post__in' => $this->get_posts_ids(),
'orderby' => 'post__in',
]);
while ($wp_query->have_posts()) {
$wp_query->the_post();
var_dump(get_the_ID());
}
}
public function change_query_posts($query_string)
{
parse_str($query_string, $args);
$args['post__in'] = $this->get_posts_ids();
$args['orderby'] = 'post__in';
query_posts($args); # query conversion
}
}
评论
这看起来不错,但是我正在寻找可以与pre_get_posts挂钩一起使用的解决方案-即,我需要修改现有的WP_Query对象。我尝试使用'$ wp_query-> init();'而不是'$ wp_query = new WP_Query();',但这似乎使事情变得混乱。有什么建议?
– ban-geoengineering
2013年12月30日22:14
您应该添加一个不同的问题,因为答案是不同的,但是您可以使用相同的代码,但只使用query2部分,将$ wp_query对象的-> posts和-> post_count部分修改为具有pre_get_posts原始查询的总和给您和您要附加的第二个查询。
– Guidod
2014年1月3日15:32
如何从此合并数组中删除重复项?
– roshan
2015年11月5日在8:02
谢谢你使用OR关系的meta_query存在问题。使用此技术将其拆分,从41s变为0.01s。
– Craig Harshbarger
16年5月8日在21:48
@ ban-geoengineering您有没有发现?我也坚持这一点。
–哈维
19-10-28在18:25