meta_query con chiave e valore da array
Ho un custom post type chiamato 'game' con alcuni campi ACF. Uno dei campi è un Post Object (chiamato review_link) che accetta post dalla categoria 'reviews'. Un altro campo è un campo tassonomia (chiamato gametags) che fa riferimento alla tassonomia post_tag dei 'posts'
Questo è ciò che sto cercando di ottenere:
Quando si legge un post (post_type=post) nella categoria Reviews, poter aggiungere informazioni nella sidebar dal Game (post_type=game) che ha questo specifico post nel campo Post Object.
Quando si legge un post (post_type=post) da qualsiasi categoria, poter ottenere i tag di quel post e cercare nei campi ACF dei Games (post_type=game), specificamente nel campo tassonomia, per trovare eventuali tag corrispondenti e mostrare alcune informazioni sul Game.
Il mio codice per il caso 1 funziona perfettamente:
$reviewID = $post->ID;
if(in_category('reviews') ) {
$reviewArgs = array(
'post_type' => 'game',
'meta_query' => array(
array(
'key' => 'review_link',
'value' => ''.$reviewID.'',
'compare' => 'LIKE'
)
)
);
}
Ora per il caso 2 ho provato quanto segue:
$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'
)
)
);
I $tag_ids per un post di esempio sono: 818,436,435,43,46,77. Se sostituisco i $tag_ids nel codice sopra con 435 funziona. Ma se provo ad aggiungerlo come array non funziona. Ho provato anche a serializzare l'array, ciclare l'array ecc. Niente funziona. Potrei creare un array di meta queries ma il problema è che il numero di tag in ogni post è casuale. Ho provato anche a convertire l'array in una stringa e usare 'LIKE' invece di 'IN' ma non funziona.
In realtà il codice sopra genera un warning: Warning: trim() expects parameter 1 to be string, array given in /.../public_html/wp-includes/class-wp-meta-query.php on line 594
Ho provato quasi tutto per far funzionare il caso 2 senza successo. Da quello che capisco la meta_query non funziona come previsto quando il meta value è un array, anche se il Codex specifica che può essere un array. Tutto il codice sopra è posizionato in sidebar.php.
Qualsiasi suggerimento o consiglio sarebbe apprezzato
Grazie in anticipo

Non so se sia possibile confrontare direttamente un array con un altro, ma puoi creare un ciclo per impostare un array meta_query
che controllerà separatamente ciascuno degli ID all'interno del campo:
$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
);
Nota: questo potrebbe generare errori se non sono impostati tag per il post, quindi potresti voler aggiungere una gestione alternativa per quel caso.
MODIFICA: prova questo per testare le corrispondenze esatte in seguito...
$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) {
// echo output
}
}

Grazie mille! In questo modo funziona!
C'è un modo per essere più specifici nel confronto? Perché IN restituisce sia '152' che '1524'?

aspetta no, sei sicuro, non sarebbe LIKE
più appropriato piuttosto che IN
?

Sì, proprio ora con un esempio live se uso IN ottengo '14739' e '14885'! LIKE e = non funzionano! Mmh forse c'è un problema nella mia logica? Comunque grazie per il tuo tempo :)

scusa colpa mia IN
dovrebbe essere davvero quello giusto, ma stai impostando gametags
come array o come stringa? Potrebbe fare la differenza perché 152 è nella stringa 1524
ma non nell'array('1525')
se capisci cosa intendo.

il $tag_ids è questo array per esempio:
Array ( [0] => 818 [1] => 436 [2] => 435 [3] => 43 [4] => 46 [5] => 77 )
Ho provato a cambiare 'value' => '"'. $tag_id .'"' ma non funziona neanche quello :P

no, capisco che è l'array $tag_ids
ma come viene impostato il campo meta gametags
, come array o come stringa? cioè, se fai get_post_meta($post->ID,'gametags');
per il tuo esempio, cosa ottieni?

In realtà un array vuoto. Hmm, che diavolo. Comunque approfondirò da solo la cosa, non voglio disturbarti ulteriormente

:-) non preoccuparti, prova il codice aggiuntivo per rieseguire i test delle corrispondenze dopo il fatto.

Poiché $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );
restituisce un array, dovresti essere in grado di utilizzarlo come
$reviewArgs = array(
'post_type' => 'game',
'meta_query' => array(
array(
'key' => 'gametags',
'value' => $tag_ids,
'compare' => 'IN'
)
)
);
Hai i metakey gametags per il post-type games? Stai usando WP_Query? Oppure get_posts()?
