I am running a multisite network and i have setup a sql query that uses swith_to_blog(); and queries the posts.
Is there a way that i can declare the query inside a new WP_Query and actually merge that query with another?
Basically if i do this:
$number1 = new WP_Query($multisitequery);
Can i merge it with:
$number2 = new WP_Query($normalquery);
$normalquery
holds settings like pagination, per page, excerpt, title etc... on a portfolio shortcode.
I would like it to include queried posts from my new $multisite
query.
Can this be achieved? Just wanting to save me from creating a whole new shortcode setup lol
Many thanks in advance. Rory
EDIT========
What i have is:
$portfolio = array();
$portfolio = $settings;
Further down my portfolio function "after all the $settings['options']" i have:
$portfolio_query = new WP_Query( $portfolio );
the $portfolio_query
uses a loop on a page template.
I want to add an extra query into this like so:
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();
}
where i assume that $globalcontainer
would be the array to merge into the wp_query();
.
So taking onboard what you have replied with, in theory i could simply:
$mergedqueryargs = array_merge($portfolio , $globalcontainer);
$portfolio_query = new WP_query($mergedqueryargs);
Would that be correct?
Second, regarding the array_merge array key overwrite..... How would i go about stopping an overwrite?
I am running a multisite network and i have setup a sql query that uses swith_to_blog(); and queries the posts.
Is there a way that i can declare the query inside a new WP_Query and actually merge that query with another?
Basically if i do this:
$number1 = new WP_Query($multisitequery);
Can i merge it with:
$number2 = new WP_Query($normalquery);
$normalquery
holds settings like pagination, per page, excerpt, title etc... on a portfolio shortcode.
I would like it to include queried posts from my new $multisite
query.
Can this be achieved? Just wanting to save me from creating a whole new shortcode setup lol
Many thanks in advance. Rory
EDIT========
What i have is:
$portfolio = array();
$portfolio = $settings;
Further down my portfolio function "after all the $settings['options']" i have:
$portfolio_query = new WP_Query( $portfolio );
the $portfolio_query
uses a loop on a page template.
I want to add an extra query into this like so:
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();
}
where i assume that $globalcontainer
would be the array to merge into the wp_query();
.
So taking onboard what you have replied with, in theory i could simply:
$mergedqueryargs = array_merge($portfolio , $globalcontainer);
$portfolio_query = new WP_query($mergedqueryargs);
Would that be correct?
Second, regarding the array_merge array key overwrite..... How would i go about stopping an overwrite?
Share Improve this question edited Jun 17, 2012 at 22:16 Rory Rothon asked Jun 17, 2012 at 10:53 Rory RothonRory Rothon 5221 gold badge6 silver badges8 bronze badges4 Answers
Reset to default 46You won't do much good just merging the arguments, you need to merge the resulting posts array and the post_count count. This works for me:
//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;
I generally merge their ID arrays and make a third query. To keep first set of queries cheap I only return their ID's using fields parameter like this:
//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));
Hope this helps
---EDIT---
After my answer original question is edited for multisite details. In case of multisite post merges this does not work.
So, if you have this:
$number1 = new WP_Query($multisitequery);
$number2 = new WP_Query($normalquery);
I assume you define these somewhere previous?
$multisitequery = array();
$normalquery = array();
...in which case, to merge the two queries, just array_merge()
the two arrays before passing them to new WP_Query()
:
$merged_query_args = array_merge( $normalquery, $multisitequery );
$merged_query = new WP_Query( $merged_query_args );
Note that order is important in the array_merge()
call. If both have the same array key, the second array will overwrite the first array.
Thus, you can glue two WP_Query queries with different post_type or other sorting data, for example, and then glue them by ids into one WP_Query query that will fully work - in order to preserve the sorting when gluing, you need to specify orderby => post__in
my example is how it creates a new WP_Query cycle and can affect any other cycle for displaying posts by calling new global_change_of_sorting_posts->change_query_posts() => query_posts() you need to call before processing the cycle for displaying 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
}
}