So, How to Get All Network Posts in a One Query?
Click the links below to jump to a specific part of the documentation.
A few notes about plugin installation
This plugin will index all posts in your Multisite Install with custom fields meta_query
and terms tax_query
. The posts and terms index will be stored in the following database tables.

Now some notes about the plugin installation.
- You can download the plugin by clicking the button in the top right part of the screen.
- Once you uploaded the plugin on your website, you have to Network Activate it from Network Admin > Plugins page.
- By default this plugin will index only the new posts you publish. If you want to add to the index your old posts, go to Settings > Index and then switch to Rebuild Index tab.

You can find the index stats in your Network Dashboard.

Example 1. Just Get the Posts like WP_Query
Let me introduce you the awesome Network_Query
class — it works just like WP_Query but for all the network websites and supports all the same parameters + blog_id
parameter (I will show how this parameter works in the next example).
Now let’s begin with something simple.
$network_q = new Network_Query('posts_per_page=5'); // display 5 latest global posts
if( $network_q->have_posts() ) :
// run the loop for each post
while( $network_q->have_posts() ) : $network_q->the_post();
// we just get post titles here
// but you can print_r( $network_q->post ) to view all post data
echo '<h3>' . $network_q->post->post_title . '</h3>';
endwhile;
else :
echo 'No posts found for this criteria';
endif;
Something a little more interesting.
// Network_Query parameters
$args = array(
'posts_per_page' => 14,
'orderby' => 'name',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'featured', // we display only posts with custom field 'featured' = 'on'
'value' => 'on'
)
)
);
$network_q = new Network_Query( $args );
// if there are posts, then print <ul>
if( $network_q->have_posts() ) :
echo '<ul>';
// run the loop
while( $network_q->have_posts() ) : $network_q->the_post();
// the get_permalink() function won't work without switch_to_blog()
// you can use network_get_permalink() instead but it is a little slower
switch_to_blog( $network_q->post->BLOG_ID );
// you can obtain the post title from $network_q->post object
echo '<li class="post-' . $network_q->post->ID . ' blog-' . $network_q->post->BLOG_ID . '">
<a href="' . get_permalink( $network_q->post->ID ) . '">' . $network_q->post->post_title . '</a>
</li>';
// restore_current_blog() to switch to the previous (!) website
restore_current_blog();
endwhile;
echo '</ul>';
endif;
network_reset_postdata(); // add it after the loop if you plan to use Network_Query multiple times on the page
Some comments:
- In the loop we obtain
$network_q->post
object — it has all WP_Post object parameters with$network_q->post->BLOG_ID
, the ID of the network blog. - If you need to do something and the WP_Post object is not enough for your purposes, then use the
switch_to_blog()
function – it allows you run any WordPress loop functions likeget_the_post_thumbnail()
,get_permalink()
etc. Just do not forget to pass a Post ID into these functions. - We need
restore_current_blog()
to cancel theswitch_to_blog()
effect, the function switches us to the previous blog — so, use it in a loop. - The
network_reset_postdata()
works similar towp_reset_postdata()
.
Example 2. Global Network Search
The next very important feature of the plugin is the global search. And you can search all blogs not for only posts and pages (post types), you can also perform search for categories and post tags (taxonomies).
Starting with the plugin version 4.4 it is even not required to do anything in the code in order to enable the global search. Just go to Settings > Index and then proceed to the Globals tab.

Use WordPress default search engine across the whole network. I mean s=
parameter of the Network_Query
class.
$args = array(
's' => 'Search query'
);
$query_search = new Network_Query( $args );
Search for posts by their custom fields values — meta_query
parameter of the Network_Query
class.
$args = array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'key1', // key1 must contain "wordcamp"
'value' => 'wordcamp',
'compare' => 'LIKE'
),
array(
'key' => 'key2', // OR key2 must contain "wordpress"
'value' => 'wordpress'
'compare' => 'LIKE'
)
)
);
$query_search = new Network_Query( $args );
Search terms by part of their titles and descriptions.
$network_cats = network_get_terms('category', 'description__like=wordcamp');
$network_cats = network_get_terms('category', 'name__like=wordpress');
In full global search tutorial I will explain you each of the above examples and show how to replace default WordPress search form and results page with the global ones.
Everything else is like in WP_Query.
Example 3. Get Posts only from the specific blogs in a network. Choose post types to index / to query
Actually you can:
- pass
post_type
orblog_id
parameter to theNetwork_Query()
class, - configure it in settings (globally for the whole network, or for each blog separately).
- post_type
- (string|array) It is default WP_Query parameter and I suppose you should already know how it works.
$args = array( 'post_type' => array( 'post', 'page' ) ); // get only posts and pages
- blog_id
- (int|array) This parameter allows to get posts from other blogs, just specify the IDs of the blogs you want to query posts from.
$args = array(
'post_type' => 'post', // only posts
'blog_id' => array( 1, 3 ) // only from blogs 1 and 3
);
Do not know where to get blog ID? Not a problem — my plugin will show a blog ID column in your network dashboard Sites > All sites.

You should also know one thing about post_type
query parameter — it will work only for indexed post types, for example here I added to the index the product
post type in the plugin settings:

And as I mentioned before, the post types for indexing can be configured individually for each network website. To do this, in your multisite dashboard go to Sites > All sites and click Configure link under the Indexing tab.

Example 4. Query Network Posts with Pagination
When you want to show posts from all blogs, it is very important to implement the pagination. And this is the simple way how you can do it:
global $wp_query;
// get the current page number from $wp_query, I mean the URL parameter, i.e. /page/2
$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // you can use $wp_query->query['paged'] as well
// similiar to query_posts()
$network_q_posts = network_query_posts( array('posts_per_page' => 3, 'paged' => $current_page) );
// run the loop
foreach( $network_q_posts as $network_q_post ) :
// we need it to work with get_the_post_thumbnail() and get_permalink()
switch_to_blog( $network_q_post->BLOG_ID );
echo '<li>' . get_the_post_thumbnail( $network_q_post->ID ) . '<a href="' . get_permalink( $network_q_post->ID ) . '">' . $network_q_post->post_title . '</a></li>';
// switch back
restore_current_blog();
endforeach;
// we should change the global $wp_query value to work correctly with pagination
$wp_query = $GLOBALS['network_query'];
// I use the popular WP PageNavi plugin
wp_pagenavi();
// reset the $wp_query
wp_reset_query();
If you have problems with this example, you can read full detailed tutorial here.
Example 5. Get categories, post tags globally using get_terms() analogue
My plugin allows you to get not only post types but taxonomy terms as well. It can be implemented easily with network_get_terms() (click the link to view the detailed tutorial).
And here is a simple example:
$network_categories = network_get_terms('category', 'orderby=name&hide_empty=0');
if( $network_categories ){
echo '<select>';
foreach ( $network_categories as $network_category ){
echo "<option value='{$network_category->term_id}'>{$network_category->name}</option>";
}
echo '</select>';
}
/*
in this example is obvious that
$network_category->name - category name,
$network_category->term_id - category global unique ID across the network
but you can get more info about the category if you look into the object using
print_r( $network_category );
*/