Obține postări cu mai multe chei meta și valori

2 sept. 2016, 09:12:26
Vizualizări: 38.9K
Voturi: 11

Încerc să obțin o postare pe baza următoarelor chei meta.

  • post_code cu valoarea 432C
  • location cu valoarea XYZ Ambele aparțin unui CPT. Încerc să obțin postarea care are ambele aceste valori meta.

Nu doresc o relație OR, vreau o relație AND, am încercat mai multe obiecte WP_Query și tot nu am găsit o soluție după ore întregi de căutare.

$args = array( 'post_type' => 'your_custom_post_type', 'meta_query' => array( 'relation' => 'AND', // Relație AND între condițiile meta array( 'key' => 'post_code', 'value' => '432C', 'compare' => '=' ), array( 'key' => 'location', 'value' => 'XYZ', 'compare' => '=' ) ) ); $query = new WP_Query($args);
2
Comentarii

Ce cod WP_Query ai încercat de fapt?

RRikesh RRikesh
2 sept. 2016 09:26:08

$args = array( 'post_type' => 'courses', 'meta_query' => array( array( 'key' => 'post_code', 'value' => '432C', ), array( 'key' => 'location', 'value' => 'XYZ', ), ), ); $query = new WP_Query( $args );

Sheraz Ahmed Sheraz Ahmed
2 sept. 2016 09:34:15
Toate răspunsurile la întrebare 6
3
17

Asta ar trebui să funcționeze. Relația implicită este ȘI (AND), așa că nu va trebui specificată.

$args = array(
    'post_type'  => 'wpse_cpt',
    'meta_query' => array(
        array(
            'key'     => 'post_code', // codul poștal
            'value'   => '432C',
        ),
        array(
            'key'     => 'location', // locația
            'value'   => 'XYZ',
        ),
    ),
);
$query = new WP_Query( $args );
2 sept. 2016 09:31:02
Comentarii

Am încercat asta, dar obțin prea multe informații, încerc să obțin rezultate folosind $wpdb.. Este posibil?

Sheraz Ahmed Sheraz Ahmed
2 sept. 2016 09:36:11

Aceasta va returna rezultatele pe care le-ai descris în întrebarea ta. Deci, fie trebuie să faci o interogare mai specifică, fie să te asiguri că articolele tale au metadate corecte.

Jeremy Ross Jeremy Ross
2 sept. 2016 16:42:10

Și da, poți folosi $wpdb, dar vei obține aceleași rezultate dacă folosești aceleași criterii. WP_Query este mai ușor și mai sigur de utilizat.

Jeremy Ross Jeremy Ross
2 sept. 2016 16:43:24
0
$args = array(
    'post_type'  => 'wpse_cpt',
    'meta_query' => array(
        'relation' => 'AND' //**** Folosește AND sau OR conform necesităților tale pentru clauza Where
        array(
            'key'     => 'post_code',
            'value'   => '432C',
        ),
        array(
            'key'     => 'location',
            'value'   => 'XYZ',
        ),
    ),
);
$query = new WP_Query( $args );
2 sept. 2016 16:23:26
4

Editare din nou: Ah, nu am răspuns la întrebare. Ai selecta a.* pentru a obține toate coloanele postărilor cu valorile cheie corespunzătoare, în loc să selectezi c.meta_value.

Următoarea interogare SQL/$wpdb va selecta toate valorile meta_value%s ale unei postări cu post_type de $postType și o valoare meta_key de $metaKey. Prin urmare, selectează toate valorile diferite ale unui meta_key dat (prin '$metaKey'). Tabelul term_relationships este tabelul helper al WordPress pentru conexiuni de relații în tabele. wp_posts este tabelul 'posts' din WordPress, iar wp_postmeta este tabelul 'postmeta' din WordPress. (Notă: Dacă utilizați tabele personalizate, aceste nume de tabele ar putea diferi.)

~ Editat pentru a adăuga note despre 'doing', la cererea lui @MikeNGarrett

/* $wpdb este o variabilă globală furnizată de 'motorul' WordPress
** pentru interogarea tabelelor bazei de date WordPress.
*/
global $wpdb; 
$postType = 'mycustomposttype';
$metaKey = 'mymetakey';
$query = "
    SELECT c.meta_value 
    FROM wp_posts a 
    LEFT JOIN wp_term_relationships b 
        ON (a.ID = b.object_id) 
    LEFT JOIN wp_postmeta c 
        ON (a.ID = c.post_id) 
    WHERE a.post_type = %s AND c.meta_key = %s";

$metaValues = $wpdb->prepare(query, [$postType, $metaKey]);
$metaValues = $wpdb->get_results($metaValues);

Note: Doar reutilizez variabila $metaValues. Nu există alt motiv pentru a scrie rezultatele $metaValues prepare() înapoi în variabila $metaValues. Cu toate acestea, trebuie să transmiți $metaValues către get_resluts().

8 mai 2019 16:56:16
Comentarii

Salut Eric! Poți să oferi puțin mai mult context? Mai ales răspunzând la "Ce face acest cod?" și "De ce este aceasta cea mai bună modalitate de a realiza acest lucru?"

MikeNGarrett MikeNGarrett
8 mai 2019 17:56:07

@MikeNGarrett, am adăugat note. Serios, poți returna orice valori dorești din oricare dintre aceste trei tabele cu interogarea. Trebuie doar să schimbi tabelul din care întrebi/compară. Prin intermediul a,b,c și . și numele coloanei.

Eric Shoberg Eric Shoberg
8 mai 2019 22:47:29

@MikeGarrett, "De ce este aceasta cea mai bună modalitate de a realiza acest lucru?". Sincer, nu știu dacă aceasta este cea mai 'bună' modalitate de a realiza acest lucru. Dar funcționează. Aș fi interesat dacă cineva găsește o metodă mai bună/mai rapidă, de asemenea. Cred că aceasta este cea mai puțin solicitantă metodă de a face asta, în limita abilităților și cunoștințelor mele actuale în acest moment.

Eric Shoberg Eric Shoberg
8 mai 2019 23:06:46

Mulțumesc! Arată bine

MikeNGarrett MikeNGarrett
9 mai 2019 18:49:27
0

SOLUȚIE

Soluția acceptată mai jos a funcționat, dar am vrut să știu cum funcționează?

Iată cum funcționează:

SELECT * FROM wp_posts p, wp_postmeta m1, wp_postmeta m2
    WHERE p.ID = m1.post_id AND p.ID = m2.post_id
    AND m1.meta_key = 'key1' AND m1.meta_value = 'value1'
    AND m2.meta_key = 'key2' AND m2.meta_value = 'value2'
    AND p.post_type = 'cpt' AND p.post_status = 'published'
15 iul. 2017 11:24:51
0

Am încercat să folosesc soluția WP_Query sugerată mai sus, dar am primit un rezultat gol. Cea sugerată de Sheraz Ahmed funcționează bine. Iată propria mea abordare, pentru ceea ce valorează:

//baza de date
wp_posts
+---------+--------------------+--------------+
|  ID     | post_title         | post_type    |
+---------+--------------------+--------------+
| 8567    | Intro to MySQL     | talk         |
+---------+--------------------+--------------+
| 8590    | Intro to PHP       | talk         |
+---------+--------------------+--------------+

wp_postmeta
+---------------+------------+----------------+
|  post_id      | meta_key   | meta_value     |
+---------------+------------+----------------+
| 8567          | speaker    | John Doe       |
+---------------+------------+----------------+
| 8567          | year_of    | 2021           |
+---------------+------------+----------------+
| 8590          | speaker    | John Doe       |
+---------------+------------+----------------+
| 8590          | year_of    | 2021           |
+---------------+------------+----------------+


//căutare după speaker și an
$speaker = "John Doe";
$year_of = "2021";

$talks = $wpdb->get_results(  
     $wpdb->prepare( 
         'SELECT post_title, meta_value AS speaker 
         FROM '.$wpdb->prefix.'posts AS pt, '.$wpdb->prefix.'postmeta AS pm 
         WHERE post_type = %s AND pm.post_id = pt.id AND ( meta_key = %s AND meta_value = %s ) 
         AND post_id IN ( SELECT post_id FROM nm_postmeta WHERE meta_key = %s AND meta_value = %s )',
         array( 'talk', 
                'speaker', 
                $speaker, 
                'year_of', 
                $year_of )
    )
);
                
foreach ( $talks as $talk ) {
    echo "<p>".$talk->speaker.': '.$talk_homily->post_title."</p>";
}

John Doe: Introducere în MySQL

John Doe: Introducere în PHP

12 sept. 2021 22:48:35
3
-1

Am încercat următorii parametri de obiect

array(
            'key' => 'post_code',
            'value' =>'432C',
            'compare' => '='
        ),
        array(
            'relation' =>'AND',
             array(

            'key' => 'location',
            'value' => 'XYZ',
             'compare' => '=',

          ),
        )
2 sept. 2016 09:28:41
Comentarii

Ar fi minunat dacă poți explica codul și cum rezolvă problema.

bravokeyl bravokeyl
2 sept. 2016 09:33:18

am explicat deja asta, te rog să încerci acești parametri folosind acești parametri, va rezolva automat problema

Manthan Dave Manthan Dave
2 sept. 2016 09:34:57

Ar trebui să explici de ce acel cod va funcționa.

RRikesh RRikesh
2 sept. 2016 09:37:50