I would like to list all posts that have a key of cp_annonceur
with the value professionnel
.
-
10Please be aware that you are expected to have researched the problem and made an attempt at solving it before posting a question. Had you not been brand new here I would have probably down-voted the question and moved on, rather than answer it. In the spirit of "Welcome to the Stack" this is your free-bee. Please take a look at How to Ask for future questions.– s_ha_dumCommented May 11, 2014 at 20:05
6 Answers
What you are asking for is a meta_query
$args = array(
'meta_key' => 'custom-meta-key',
'meta_query' => array(
array(
'key' => 'cp_annonceur',
'value' => 'professionnel',
'compare' => '=',
)
)
);
$query = new WP_Query($args);
-
3@Beginner : if this solved the problem please mark it "Accepted". Look for the check mark near the vote arrows on the left.– s_ha_dumCommented May 11, 2014 at 20:35
-
1For some reason using
new WP_Query($args)
and then callingget_posts
doesn't work for me. Directly passing the$args
array to theget_posts
function as an argument works however.– KunalCommented May 5, 2020 at 21:24 -
@Kunal You don't need to call get_posts. Use the code above, and get the posts like so:
$query->posts
. It should return an array. Don't forget to read the link in the comment, as there is something missing in the code:$args = array( 'post_type' => 'your-cpt', 'meta_key' => 'your-meta', 'meta_query' => array( array( 'key' => 'cp_annonceur', 'value' => 'professionnel', 'compare' => '=', ) ) ); $query = new WP_Query($args);
Commented Jan 14, 2021 at 0:32 -
@s_ha_dum minor syntax correction - missing
,
after'custom-meta-key'
. Would have editied, but it's not possible to make a 1 character edit...– StevenCommented Apr 29, 2021 at 12:57 -
There are two ways to do that:
Intercept the main query on
pre_get_posts
:add_action( 'pre_get_posts', function( $query ) { // only handle the main query if ( ! $query->is_main_query() ) return; $query->set( 'meta_key', 'cp_annonceur' ); $query->set( 'meta_value', 'professionnel' ); } );
Add an additional query
$second_loop = get_posts( array( 'meta_key' => 'cp_annonceur', 'meta_value' => 'professionnel', ) );
A more throughout example can be found in this answer.
-
2
-
-
I used custom select (might be better performance)
$posts = $wpdb->get_results("SELECT * FROM $wpdb->postmeta
WHERE meta_key = 'cp_annonceur' AND meta_value = 'professionnel' LIMIT 1", ARRAY_A);
Inspired from https://tommcfarlin.com/get-post-id-by-meta-value/
-
6It might have better performances, but it throws away the whole idea of having Wordpress functions to search (and cache) data. And, also, what will happen if WP decides to change the table structure? :) Commented Mar 3, 2017 at 10:11
-
@ErenorPaz I understand what you are saying but this way would make it easy if you had multiple meta key/values as a criteria... Is there an official way to handle multiple criteria?– G-JCommented Apr 9, 2020 at 22:59
-
2You mean something like
WHERE metatable1.meta_key = 'cp_annonceur' AND metatable1.meta_value = 'professionnel' AND metatable2.meta_key = 'cp_other_meta' AND metatable2.meta_value = 'other_value'
? (Note that i suppose we do a join on the same posts_meta table using two namesmetatable1
andmetatable2
). This can be achieved adding fieldmeta_query
(as an array) to the query. Take a look at: developer.wordpress.org/reference/classes/wp_query/… and go to paragraph "‘orderby’ with multiple ‘meta_key’s" Commented Apr 10, 2020 at 11:19
We can get the desired result with Meta query of the WordPress :
// the meta_key 'diplay_on_homepage' with the meta_value 'true'
$cc_args = array(
'posts_per_page' => -1,
'post_type' => 'post',
'meta_key' => 'cp_annonceur',
'meta_value' => 'professionnel'
);
$cc_query = new WP_Query( $cc_args );
For more detailed guide regarding meta query follow this blog : http://www.codecanal.com/get-posts-meta-values/
-
-
1@AbhayGawade You can limit max number of results using that parameter, -1 means no limit.– KushCommented Jun 20, 2018 at 17:49
-
1
You can easily grab the posts using WordPress's built-in function called get_posts You can find more details about get_posts here https://developer.wordpress.org/reference/functions/get_posts/
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'cp_annonceur',
'meta_value' => 'professionnel'
));
Try this, It's working for me
global $wpdb;
$meta_key = '_request_body';
$data = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key) , ARRAY_N );
$result = [];
foreach($data as $array){
$result[] = $array[0];
}
print_r($result);
-
That would list the distinct possible values, which isn't quite what the question asks for.– RupCommented Jan 20, 2021 at 16:19
-
You should never access the database for such fundamental WP things as getting posts. You should always use abstracted WP-API which does all the heavy lifting for you and ensures your code will work if anything is changed under the hood. Commented Nov 18, 2022 at 20:03