Ottieni i post tramite valore meta
Vorrei elencare tutti i post che hanno una chiave cp_annonceur
con il valore professionnel
.

Quello che stai chiedendo è una meta_query
$args = array(
'meta_key' => 'custom-meta-key',
'meta_query' => array(
array(
'key' => 'cp_annonceur',
'value' => 'professionnel',
'compare' => '=',
)
)
);
$query = new WP_Query($args);

@Principiante : se questo ha risolto il problema, per favore segnalo come "Accettato". Cerca il segno di spunta vicino alle frecce di voto a sinistra.

Per qualche motivo usare new WP_Query($args)
e poi chiamare get_posts
non funziona per me. Passare direttamente l'array $args
alla funzione get_posts
come argomento invece funziona.

@Kunal Non hai bisogno di chiamare get_posts.
Usa il codice sopra, e ottieni i post così: $query->posts
. Dovrebbe restituire un array.
Non dimenticare di leggere il link nel commento, poiché c'è qualcosa che manca nel codice:
$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);

@s_ha_dum correzione sintattica minore - manca una ,
dopo 'custom-meta-key'
. Avrei modificato direttamente, ma non è possibile fare una modifica di un solo carattere...

Questo sarebbe sbagliato. Perché dovresti passare sia meta_key che key?
Non è così come viene descritto nella documentazione di WP Query.
Probabilmente quello che intendevi dire è qualcosa tipo
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
),
?

Ci sono due modi per farlo:
Intercettare la query principale con
pre_get_posts
:add_action( 'pre_get_posts', function( $query ) { // gestisce solo la query principale if ( ! $query->is_main_query() ) return; $query->set( 'meta_key', 'cp_annonceur' ); $query->set( 'meta_value', 'professionnel' ); } );
Aggiungere una query aggiuntiva
$second_loop = get_posts( array( 'meta_key' => 'cp_annonceur', 'meta_value' => 'professionnel', ) );
Un esempio più completo è disponibile in questa risposta.

@G-J potresti dare un'occhiata a questo esempio.

Ho utilizzato una select personalizzata (potrebbe avere prestazioni migliori)
$posts = $wpdb->get_results("SELECT * FROM $wpdb->postmeta
WHERE meta_key = 'cp_annonceur' AND meta_value = 'professionnel' LIMIT 1", ARRAY_A);
Ispirato da https://tommcfarlin.com/get-post-id-by-meta-value/

Potrebbe avere prestazioni migliori, ma abbandona completamente l'idea di utilizzare le funzioni di WordPress per cercare (e memorizzare nella cache) i dati. Inoltre, cosa succederebbe se WordPress decidesse di modificare la struttura della tabella? :)

@ErenorPaz Capisco quello che dici, ma questo approccio renderebbe più semplice gestire più criteri basati su meta key/values... Esiste un modo ufficiale per gestire più criteri?

Intendi qualcosa come WHERE metatable1.meta_key = 'cp_annonceur' AND metatable1.meta_value = 'professionnel' AND metatable2.meta_key = 'cp_other_meta' AND metatable2.meta_value = 'other_value'
? (Nota che suppongo di fare un join sulla stessa tabella posts_meta usando due nomi metatable1
e metatable2
). Questo può essere ottenuto aggiungendo il campo meta_query
(come array) alla query. Dai un'occhiata a: https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters e vai al paragrafo "‘orderby’ with multiple ‘meta_key’s"

Possiamo ottenere il risultato desiderato con la Meta query di WordPress:
// il meta_key 'diplay_on_homepage' con il 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 );
Per una guida più dettagliata sulle meta query segui questo blog: http://www.codecanal.com/get-posts-meta-values/

Puoi facilmente recuperare i post utilizzando la funzione integrata di WordPress chiamata get_posts Puoi trovare maggiori dettagli su get_posts qui https://developer.wordpress.org/reference/functions/get_posts/
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'cp_annonceur',
'meta_value' => 'professionnel'
));

Prova questo, funziona per 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);

Questo elencherebbe i possibili valori distinti, che non è esattamente ciò che la domanda chiede.

Non dovresti mai accedere al database per operazioni fondamentali di WordPress come ottenere i post. Dovresti sempre usare l'API astratta di WordPress che fa tutto il lavoro pesante per te e assicura che il tuo codice continui a funzionare se qualcosa viene modificato internamente.
