meta_query con chiave e valore da array

19 mag 2016, 12:29:32
Visualizzazioni: 21.5K
Voti: 3

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:

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

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

0
Tutte le risposte alla domanda 2
10

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
    }
}
19 mag 2016 13:12:04
Commenti

Grazie mille! In questo modo funziona!

C'è un modo per essere più specifici nel confronto? Perché IN restituisce sia '152' che '1524'?

Pantso Pantso
19 mag 2016 14:05:56

prova = o EQUALS invece se stai cercando una corrispondenza esatta

majick majick
19 mag 2016 14:09:26

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

majick majick
19 mag 2016 14:12:16

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

Pantso Pantso
19 mag 2016 14:18:39

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.

majick majick
19 mag 2016 14:19:28

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

Pantso Pantso
19 mag 2016 14:21:58

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?

majick majick
19 mag 2016 14:25:05

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

Pantso Pantso
19 mag 2016 14:29:51

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

majick majick
19 mag 2016 14:40:50

Se la tua strada ti porterà in Grecia, ti devo una birra! :) Grazie ancora

Pantso Pantso
19 mag 2016 14:43:30
Mostra i restanti 5 commenti
1

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

19 mag 2016 13:45:41
Commenti

Sì, il resto del codice è

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

Pantso Pantso
19 mag 2016 14:04:24