Interogare meta_query cu cheie și valoare dintr-un array
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:
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.
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

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
}
}

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

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

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.

$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

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?

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

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

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