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

是否可以在新的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;


评论


这看起来不错,但是我正在寻找可以与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

#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
    }
}