Interogare meta_query cu cheie și valoare dintr-un array

19 mai 2016, 12:29:32
Vizualizări: 21.5K
Voturi: 3

Am un tip de postare personalizat numit 'game' cu câteva câmpuri ACF. Unul dintre câmpuri este un Post Object (numit review_link) care acceptă postări din categoria 'reviews'. Un alt câmp este un câmp taxonomie (numit gametags) care caută în taxonomia post_tag a postărilor 'posts'

Iată ce încerc să realizez:

  1. Când citești o postare (post_type=post) din categoria Reviews să poți adăuga informații în sidebar, din Game (post_type=game) care are această postare specifică în câmpul Post Object.

  2. Când citești o postare (post_type=post) din orice categorie, să poți obține tagurile acelei postări și să cauți în câmpurile ACF ale Games (post_type=game), specific în câmpul taxonomie, pentru a găsi orice taguri care se potrivesc, și apoi să afișezi informații despre Joc.

Codul meu pentru cazul 1 este următorul și funcționează perfect:

$reviewID = $post->ID;
if(in_category('reviews') ) {

    $reviewArgs = array(
      'post_type'    => 'game',
      'meta_query' => array(
         array(
           'key' => 'review_link',
           'value' => ''.$reviewID.'',
           'compare' => 'LIKE'
         )
       )
    );

}

Pentru cazul 2 am încercat următorul cod:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

$tag_ids pentru un post exemplu sunt: 818,436,435,43,46,77. Dacă înlocuiesc $tag_ids în codul de mai sus cu 435 funcționează. Dar dacă încerc să-l adaug ca array nu funcționează. Am încercat și serializarea array-ului, parcurgerea array-ului etc. Nimic nu funcționează. Aș putea face un array de interogări meta dar problema este că numărul de taguri din fiecare post este aleatoriu. Am încercat și convertirea array-ului într-un string și folosirea 'LIKE' în loc de 'IN' și nimic.

De fapt codul de mai sus aruncă o avertizare: Warning: trim() expects parameter 1 to be string, array given in /.../public_html/wp-includes/class-wp-meta-query.php on line 594

Am încercat aproape tot pentru a face cazul 2 să funcționeze și nu am reușit. Din ce realizez meta_query nu funcționează așa cum era de așteptat când valoarea meta este un array, deși Codex specifică că poate fi un array. Tot codul de mai sus este plasat în sidebar.php.

Orice sfaturi sau sugestii ar fi apreciate

Mulțumesc anticipat

0
Toate răspunsurile la întrebare 2
10

Nu știu dacă poți compara direct un array cu altul, dar poți crea o buclă pentru a configura un array meta_query care va verifica fiecare ID din câmp separat:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$meta_query = array('relation' => 'OR');

foreach ($tags_ids as $tag_id) {
    $meta_query[] = array(
        'key' => 'gametags',
        'value' => $tag_id,
        'compare' => 'IN'
    );
}

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => $meta_query
);

Notă: acest cod poate produce erori dacă nu sunt setate etichete pentru postare, așa că poți dori să adaugi o gestionare alternativă pentru acest caz.

EDIT: încearcă asta pentru a testa potrivirile exacte mai târziu...

$review_query = new WP_Query( $reviewArgs ); 
while( $review_query->have_posts() ) { 
    $review_query->the_post(); 
    global $post; $checkmatch = false;
    $gametags = get_post_meta($post->ID,'gametags');
    if (!is_array($gametags)) {$gametags = explode(',',$gametags);}
    foreach ($tags_ids as $tag_id) {
        if (in_array($tag_id,$gametags)) {$checkmatch = true;}
    }
    if ($checkmatch) {
         // afișează rezultatul
    }
}
19 mai 2016 13:12:04
Comentarii

Mulțumesc mult! Așa funcționează!

Există o modalitate de a fi mai specific în comparație? Pentru că IN returnează '152' și '1524'?

Pantso Pantso
19 mai 2016 14:05:56

încearcă = sau EQUALS în loc dacă cauți o potrivire exactă

majick majick
19 mai 2016 14:09:26

stai, nu, ești sigur, nu ar fi LIKE mai potrivit decât IN?

majick majick
19 mai 2016 14:12:16

Da, chiar acum cu un exemplu live dacă folosesc IN obțin '14739' și '14885'! LIKE și = nu funcționează! Hm poate este o problemă în logica mea? Oricum, mulțumesc pentru timpul acordat :)

Pantso Pantso
19 mai 2016 14:18:39

scuze, greșeala mea IN ar trebui să fie soluția, dar setezi gametags ca array sau ca string? ar putea face diferența pentru că 152 este în stringul 1524 dar nu și în array('1525') dacă înțelegi ce vreau să spun.

majick majick
19 mai 2016 14:19:28

$tag_ids este acest array de exemplu:

Array ( [0] => 818 [1] => 436 [2] => 435 [3] => 43 [4] => 46 [5] => 77 )

Am încercat să schimb 'value' => '"'. $tag_id .'"' dar nici așa nu funcționează :P

Pantso Pantso
19 mai 2016 14:21:58

nu, înțeleg că acesta este array-ul $tag_ids, dar cum este setat câmpul meta gametags, ca array sau ca string? adică dacă faci get_post_meta($post->ID,'gametags'); pentru exemplul tău, ce primești?

majick majick
19 mai 2016 14:25:05

De fapt un array gol. Hm, ce naiba... Oricum, o să investighez mai departe singur, nu vreau să te mai deranjez.

Pantso Pantso
19 mai 2016 14:29:51

:-) nu-ți face griji, încearcă codul adăugat pentru a testa din nou potrivirile ulterior.

majick majick
19 mai 2016 14:40:50

Dacă drumul tău te duce în Grecia, îți datorez o bere! :) Mulțumesc din nou

Pantso Pantso
19 mai 2016 14:43:30
Arată celelalte 5 comentarii
1

Deoarece $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) ); returnează un array, ar trebui să poți să-l folosești astfel:

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

Ai metakey-urile gametags pentru post-type-ul games? De asemenea, folosești WP_Query? Sau get_posts()?

19 mai 2016 13:45:41
Comentarii

Da, restul codului este

$review_query = new WP_Query( $reviewArgs ); while( $review_query->have_posts() ) { $review_query->the_post();

Pantso Pantso
19 mai 2016 14:04:24