Get All Posts by Post Meta Key and Meta Value with meta_query

Advertisement

Are you trying to retrieve all posts from your WordPress site that have a specific meta key and meta value set?

This can be done easily by using the meta_query parameter of the WP_Query class.

In this article, we’ll show you how to use this parameter to fetch all posts with a specific meta key and value.

Here’s how to get all posts by post meta key and meta value with meta_query in WordPress:

In this article we are going to see:

Step 1: Create a new WP_Query object Step 1: Create a new WP_Query object

The first step is to create a new instance of the WP_Query class. This object will allow us to query the WordPress database for posts that match our criteria. Here’s how to do it:

$args = array(
   'post_type' => 'post',
   'meta_query' => array(
      array(
         'key' => 'my_meta_key',
         'value' => 'my_meta_value',
         'compare' => '=',
      )
   )
);

$my_query = new WP_Query($args);

This will create a new WP_Query object with the post_type parameter set to ‘post’ and the meta_query parameter set to an array containing a single array with the meta key, meta value, and comparison operator.

Top ↑

Step 2: Loop through the posts Step 2: Loop through the posts

Once we have the WP_Query object, we can loop through the posts and display them on our page.

Here’s an example of how to do this:

if ($my_query->have_posts()) {
   while ($my_query->have_posts()) {
      $my_query->the_post();
      // Display the post content here
   }
}

This will loop through all the posts that match our criteria and display their content.

Top ↑

Step 3: Reset the post data Step 3: Reset the post data

After we’re done looping through the posts, we need to reset the post data so that other functions can work correctly. Here’s how to do it:

wp_reset_postdata();

This will reset the global $post variable back to the original post that was displayed before our custom query.

And that’s it! You now know how to get all posts by post meta key and meta value with meta_query in WordPress.

Top ↑

Real-life example Real-life example

Note: I’m giving you an imaginary example just for a reference to understand, In which situation you can use below code snippet.

Suppose,

  • We have a custom post type properties.
  • We have 15 properties are published.
  • We have stored the location of each property in the meta key property-location
  • And, We want to get all the properties which the meta key is property-location with meta value Pune.

Code Snippet Code Snippet

$query_args = array(
	'post_type'  => 'properties',
	'meta_query' => array(
	    array(
			'key'   => 'property-location',
			'value' => 'Pune',
	    ),
	)
);
$query = new WP_Query( $query_args );

Here,
post_type is our custom post type slug. In our example its properties.
key is meta key. In our example its property-location
value is meta value. In our example its Pune

Top ↑

Gist Snippet Gist Snippet

You can use below complete gist code snippet for reference.
Note: In below code snippet you need to change the parameters as you need.

<?php
/**
* Get all post by post meta key and meta value.
*
* @todo Change the `prefix_` and with your own unique prefix.
*
* @since 1.0.0
*/
if( ! function_exists( 'prefix_search_post_by_post_meta_value' ) ) :
function prefix_search_post_by_post_meta_value() {
$query_args = array(
'post_type' => 'post',
// Query performance optimization.
'fields' => 'ids',
'no_found_rows' => true,
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'my-meta-key',
'value' => 'my-meta-value',
),
)
);
$query = new WP_Query( $query_args );
if ( $query->posts ) {
foreach ( $query->posts as $key => $post_id ) {
// var_dump( $post_id );
// Code goes here..
}
}
}
add_action( 'admin_head', 'prefix_search_post_by_post_meta_value' );
endif;

Here,
I have added some extra parameters to optimize the WordPress query.

  • fields with a value id that returns ONLY array post IDs of all found items.
  • no_found_rows with value true which optimizes the query.
  • posts_per_page with value -1 to get all the posts. Default it returns only 10 items.

Top ↑

Frequently Asked Questions Frequently Asked Questions

Top ↑

What is a meta_query in WordPress? What is a meta_query in WordPress?

A meta_query is a way to filter WordPress posts based on the post’s metadata.

It allows you to retrieve posts that have specific metadata values associated with them.

Top ↑

How do I use meta_query to get all posts with a specific post meta key and meta value? How do I use meta_query to get all posts with a specific post meta key and meta value?

You can use the following code to get all posts with a specific post meta key and meta value:

<pre>
$args = array(
‘post_type’ => ‘post’,
‘meta_query’ => array(
array(
‘key’ => ‘my_meta_key’,
‘value’ => ‘my_meta_value’,
),
),
);
$query = new WP_Query( $args );
</pre>

Replace my_meta_key with the name of your post meta key and my_meta_value with the value you want to search for.

Top ↑

Can I use meta_query to retrieve posts with multiple meta values? Can I use meta_query to retrieve posts with multiple meta values?

Yes, you can use the compare parameter to specify how to compare the meta value with your search value.

For example, you can use the IN operator to search for posts that have any of the specified values:

<pre>
$args = array(
‘post_type’ => ‘post’,
‘meta_query’ => array(
array(
‘key’ => ‘my_meta_key’,
‘value’ => array( ‘value1’, ‘value2’, ‘value3’ ),
‘compare’ => ‘IN’,
),
),
);
$query = new WP_Query( $args );
</pre>

Top ↑

What if I want to search for posts with a meta value that starts with a specific string? What if I want to search for posts with a meta value that starts with a specific string?

You can use the LIKE operator and add a wildcard character (%) to the beginning of your search value.

For example:

<pre>
$args = array(
‘post_type’ => ‘post’,
‘meta_query’ => array(
array(
‘key’ => ‘my_meta_key’,
‘value’ => ‘my_search_value%’,
‘compare’ => ‘LIKE’,
),
),
);
$query = new WP_Query( $args );
</pre>

Top ↑

Can I use meta_query to search for posts based on multiple meta keys? Can I use meta_query to search for posts based on multiple meta keys?

Yes, you can add multiple meta-queries to your argument array.

For example:

<pre>
$args = array(
‘post_type’ => ‘post’,
‘meta_query’ => array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘my_meta_key_1’,
‘value’ => ‘my_value_1’,
),
array(
‘key’ => ‘my_meta_key_2’,
‘value’ => ‘my_value_2’,
),
),
);
$query = new WP_Query( $args );
</pre>

This will retrieve all posts that have both my_meta_key_1 and my_meta_key_2 with the specified values.

Top ↑

Conclusion Conclusion

Retrieving all posts that have a specific meta key and value is a common task in WordPress development.

By using the meta_query parameter of the WP_Query class, we can easily query the database for these posts and display them on our site.

We hope this guide has been helpful to you, and if you have any questions or comments, feel free to leave them below.