Obține postări după valoarea meta

11 mai 2014, 22:56:24
Vizualizări: 155K
Voturi: 50

Aș dori să listez toate postările care au o cheie cp_annonceur cu valoarea professionnel.

1
Comentarii

Te rog să fii conștient că se așteaptă să fi cercetat problema și să fi încercat să o rezolvi înainte de a posta o întrebare. Dacă nu ai fi fost nou venit aici, probabil aș fi votat negativ întrebarea și aș fi trecut mai departe, în loc să o răspund. În spiritul "Bine ai venit pe Stack", aceasta este prima ta întrebare gratuită. Te rog să consulți [ask] pentru viitoarele întrebări.

s_ha_dum s_ha_dum
11 mai 2014 23:05:35
Toate răspunsurile la întrebare 6
6
81

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

Toate informațiile de care ai nevoie se găsesc în Codex.

11 mai 2014 23:05:26
Comentarii

@Î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.

s_ha_dum s_ha_dum
11 mai 2014 23:35:35

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 Kunal
6 mai 2020 00:24:03

@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);

BonisTech BonisTech
14 ian. 2021 02:32:05

@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...

Steven Steven
29 apr. 2021 15:57:12

Care este diferența între meta_key și key?

Michael Rogers Michael Rogers
14 ian. 2022 13:20:26

Aceasta ar fi greșit. De ce ai trece meta_key și apoi key? Nu așa este descris în Documentația WP Query. Probabil voiai să spui ceva de genul: 'post_type' => 'product', 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE', ), ), ?

User User
24 sept. 2022 10:22:07
Arată celelalte 1 comentarii
3
16

Există două moduri de a face acest lucru:

  1. 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' );
    } );
    
  2. 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.

11 mai 2014 23:08:01
Comentarii

Bine de știut varianta scurtă cu get_posts()

Andrew Welch Andrew Welch
26 ian. 2017 18:06:09

Cum faci asta cu mai multe chei/valori meta?

G-J G-J
10 apr. 2020 01:57:44

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

kaiser kaiser
15 apr. 2020 18:18:04
3
12

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/

28 ian. 2016 16:40:33
Comentarii

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? :)

Erenor Paz Erenor Paz
3 mar. 2017 12:11:58

@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?

G-J G-J
10 apr. 2020 01:59:57

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"

Erenor Paz Erenor Paz
10 apr. 2020 14:19:09
3

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/

4 oct. 2017 08:46:42
Comentarii

Pot să știu de ce valoarea post_per_page este -1?

Abhay Abhay
27 apr. 2018 08:07:56

@AbhayGawade Poți limita numărul maxim de rezultate folosind acest parametru, -1 înseamnă fără limită.

Kush Kush
20 iun. 2018 20:49:03

Mulțumesc, omule, funcționează perfect. :)

Arman H Arman H
23 feb. 2022 08:05:08
0

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
));
31 mai 2021 18:48:12
2

Î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);
20 ian. 2021 12:20:12
Comentarii

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

Rup Rup
20 ian. 2021 18:19:34

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.

Zarko Jovic Zarko Jovic
18 nov. 2022 22:03:39