web-dev-qa-db-fra.com

valeur de clé meta_query du tableau

J'ai un type de message personnalisé appelé "jeu" avec des champs ACF. L'un des champs est un objet de publication (appelé review_link) qui accepte les publications d'une catégorie appelée "critiques". Un autre champ est un champ taxonomie (appelé gametags) recherchant la taxonomie post_tag des 'posts'.

C'est ce que j'essaie de réaliser:

  1. Chaque fois que vous lisez un article (post_type = post) dans la catégorie Avis, vous pouvez ajouter des informations dans la barre latérale, à partir du jeu (post_type = jeu) qui contient cet article spécifique dans le champ Objet de publication.

  2. Chaque fois que vous lisez un article (post_type = post) de n’importe quelle catégorie, vous pouvez obtenir les tags de cet article et consulter les champs ACF Jeux (post_type = game), et plus particulièrement dans le champ taxonomie, pour rechercher les tags correspondants, puis montrez des informations sur le jeu.

Mon code pour le cas 1 est le suivant et cela fonctionne très bien:

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

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

}

Maintenant pour le cas 2, j'ai essayé ce qui suit:

$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'
         )
    ) 
);

Les $ tag_ids pour un exemple de publication sont: 818,436,435,43,46,77. Si je remplace les $ tag_ids dans le code ci-dessus par 435, cela correspond. Mais si j'essaie de l'ajouter comme un tableau, ce n'est pas le cas. J'ai également essayé de sérialiser le tableau, de le boucler, etc. Rien de tout cela ne fonctionne. Je pourrais faire un tableau de méta-requêtes mais le fait est que le nombre de tags dans chaque message est aléatoire. J'ai également essayé de convertir le tableau en chaîne et d'utiliser 'LIKE' au lieu de 'IN' et de rien.

En réalité, le code ci-dessus renvoie un avertissement: Avertissement: trim () s'attend à ce que le paramètre 1 soit une chaîne, le tableau figurant dans /.../public_html/wp-includes/class-wp-meta-query.php à la ligne 594.

J'ai presque tout essayé pour que le cas 2 fonctionne, mais je n'y suis pas parvenu. De ce que je réalise, la méta_query ne fonctionne pas comme prévu lorsque la méta-valeur est un tableau, bien que le Codex spécifie qu'il peut s'agir d'un tableau. Tout le code ci-dessus est placé dans sidebar.php.

Des astuces conseils seraient appréciés

Merci d'avance

3
Pantso

Je ne sais pas si vous pouvez comparer directement un tableau à l'autre, mais vous pouvez créer une boucle pour configurer un tableau meta_query qui vérifie séparément chacun des identifiants du champ:

$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
);

Remarque: cela pourrait produire des erreurs si aucune balise n'est définie pour la publication. Vous pouvez donc ajouter une autre gestion pour ce cas.

EDIT: essayez ceci pour tester les correspondances exactes plus tard ...

$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
    }
}
1
majick

Puisque $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) ); renvoie un tableau, vous devriez pouvoir l'utiliser comme

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

Avez-vous les étiquettes de jeu metakeys pour les jeux de type post? Utilisez-vous également WP_Query? Ou get_posts ()?

0
bagpipper