Obține postări după valoarea meta
Aș dori să listez toate postările care au o cheie cp_annonceur
cu valoarea professionnel
.

Ceea ce cauți se numește un meta_query
$args = array(
'meta_key' => 'custom-meta-key',
'meta_query' => array(
array(
'key' => 'cp_annonceur',
'value' => 'professionnel',
'compare' => '=',
)
)
);
$query = new WP_Query($args);

@Începător : dacă această soluție a rezolvat problema, te rugăm să o marchezi ca "Acceptată". Caută bifa lângă săgețile de vot din stânga.

Din nu știu ce motiv, utilizarea new WP_Query($args)
și apoi apelarea get_posts
nu funcționează pentru mine. Însă, transmiterea directă a array-ului $args
ca argument funcției get_posts
funcționează.

@Kunal Nu este nevoie să apelezi get_posts.
Folosește codul de mai sus și obține postările astfel: $query->posts
. Ar trebui să returneze un array.
Nu uita să citești link-ul din comentariu, deoarece lipsește ceva din cod:
$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 corecție minoră de sintaxă - lipsește ,
după 'custom-meta-key'
. Aș fi editat, dar nu este posibil să faci o modificare de doar 1 caracter...

Există două moduri de a face acest lucru:
Interceptează interogarea principală pe
pre_get_posts
:add_action( 'pre_get_posts', function( $query ) { // gestionează doar interogarea principală if ( ! $query->is_main_query() ) return; $query->set( 'meta_key', 'cp_annonceur' ); $query->set( 'meta_value', 'professionnel' ); } );
Adaugă o interogare suplimentară
$second_loop = get_posts( array( 'meta_key' => 'cp_annonceur', 'meta_value' => 'professionnel', ) );
Un exemplu mai detaliat poate fi găsit în acest răspuns.

@G-J poate ai nevoie să arunci o privire la acest exemplu.

Am folosit o interogare personalizată SELECT (ar putea avea o performanță mai bună)
$posts = $wpdb->get_results("SELECT * FROM $wpdb->postmeta
WHERE meta_key = 'cp_annonceur' AND meta_value = 'professionnel' LIMIT 1", ARRAY_A);
Inspirat din https://tommcfarlin.com/get-post-id-by-meta-value/

S-ar putea să aibă performanțe mai bune, dar renunță la întreaga idee de a utiliza funcțiile WordPress pentru a căuta (și a stoca în cache) datele. Și, de asemenea, ce se va întâmpla dacă WordPress decide să schimbe structura tabelelor? :)

@ErenorPaz Înțeleg ce spui, dar această metodă ar fi utilă dacă ai mai multe criterii bazate pe perechi cheie/valoare din meta... Există o modalitate oficială de a gestiona mai multe criterii?

Te referi la ceva de genul WHERE metatable1.meta_key = 'cp_annonceur' AND metatable1.meta_value = 'professionnel' AND metatable2.meta_key = 'cp_other_meta' AND metatable2.meta_value = 'other_value'
? (Reține că presupunem că facem un join pe aceeași tabelă posts_meta folosind două nume metatable1
și metatable2
). Acest lucru poate fi realizat adăugând câmpul meta_query
(ca un array) la interogare. Consultă: https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters și mergi la paragraful "‘orderby’ with multiple ‘meta_key’s"

Putem obține rezultatul dorit cu interogarea Meta din WordPress:
// cheia meta 'diplay_on_homepage' cu valoarea meta '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 );
Pentru un ghid mai detaliat despre interogările Meta, urmărește acest blog: http://www.codecanal.com/get-posts-meta-values/

Puteți prelua cu ușurință articolele folosind funcția încorporată a WordPress numită get_posts Puteți găsi mai multe detalii despre get_posts aici https://developer.wordpress.org/reference/functions/get_posts/
$posts = get_posts(array(
'numberposts' => -1, // numărul de articole de returnat (-1 pentru toate)
'post_type' => 'post', // tipul de articol
'meta_key' => 'cp_annonceur', // cheia meta
'meta_value' => 'professionnel' // valoarea meta
));

Încearcă asta, la mine funcționează
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);

Aceasta ar lista valorile distincte posibile, ceea ce nu este exact ceea ce întrebarea solicită.

Nu ar trebui să accesezi niciodată baza de date pentru lucruri fundamentale WordPress precum obținerea postărilor. Ar trebui să folosești întotdeauna API-ul abstractizat WordPress care se ocupă de toată munca grea pentru tine și asigură că codul tău va funcționa dacă se schimbă ceva în spate.
