I would like to list all posts that have a key of cp_annonceur with the value professionnel.


What you are asking for is a meta_query

$args = array(
   'meta_key' => 'custom-meta-key'
   'meta_query' => array(
           'key' => 'cp_annonceur',
           'value' => 'professionnel',
           'compare' => '=',
$query = new WP_Query($args);

All of the information you need is in the Codex.

  • 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_dum May 11 '14 at 20:35
  • 1
    For some reason using new WP_Query($args) and then calling get_posts doesn't work for me. Directly passing the $args array to the get_posts function as an argument works however. – Kunal May 5 '20 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); – Jonas Merhej Jan 14 at 0:32

There are two ways to do that:

  1. 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() )
        $query->set( 'meta_key',   'cp_annonceur' );
        $query->set( 'meta_value', 'professionnel' );
    } );
  2. 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
    Nice to know the short way with get_posts() – Andrew Welch Jan 26 '17 at 16:06
  • How do you do this with multiple meta ket/values ? – G-J Apr 9 '20 at 22:57
  • @G-J you might want to take a look at this example. – kaiser Apr 15 '20 at 15:18

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/

  • 3
    It 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? :) – Erenor Paz Mar 3 '17 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-J Apr 9 '20 at 22:59
  • You 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 names metatable1 and metatable2). This can be achieved adding field meta_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" – Erenor Paz Apr 10 '20 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/

  • May i know why this post_per_page value is -1? – Abhay Apr 27 '18 at 5:07
  • 1
    @AbhayGawade You can limit max number of results using that parameter, -1 means no limit. – Kush Jun 20 '18 at 17:49

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];

New contributor
Tayyab Chaudhary is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
  • That would list the distinct possible values, which isn't quite what the question asks for. – Rup 21 hours ago

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.