meta_query 'compare' => 'IN' ne fonctionne pas


13

Tout d'abord, je sais que c'est un doublon, mais aucune des réponses plus anciennes n'était utile.

Je cherche dans les articles post_meta. Voici mon code, qui ne renvoie actuellement rien.

$args   =   array(
    'numberposts'   => -1,
    'post_type'     => 'post',
    'meta_query'    => array(
        array(
            'key'       => 'system_power_supply',
            'value'     => array('single', 'redundant'),
            'compare'   => 'IN',
        )
    )

);

$query = new WP_Query($args);
echo $query->found_posts;

Si je supprime meta_querycela fonctionne. Je suis sûr de ces choses:

  • Il n'y a aucune faute d'orthographe dans le keyou le value.
  • le type de message est post
  • Il y a un article avec la valeur 'single' dans 'system_power_supply'. Cependant, les champs de publication sont générés par des champs personnalisés avancés .

est system_power_supplysérialisé?
Howdy_McGee

Oui, ça l'est. Voici la valeur dans le tableau postmeta a:1:{i:0;s:6:"single";}
Rizwan

2
Eh bien, c'est votre problème, la méta-requête ne fonctionnera pas sur les données sérialisées. si vous effectuez une recherche sur ce site pour rechercher des données sérialisées, vous trouverez des réponses, mais aucune méthode ne sera idéale.
Milo

Réponses:


13

Il n'y a pas de moyen simple de rechercher des valeurs sérialisées dans une méta-requête. Si la liste de valeurs n'est pas longue, vous pouvez potentiellement configurer plusieurs méta-requêtes:

'meta_query'    => array(
    'relation' => 'OR',
    array(
        'key'       => 'system_power_supply',
        'value'     => 'single',
        'compare'   => 'LIKE',
    ),
    array(
        'key'       => 'system_power_supply',
        'value'     => 'redundant',
        'compare'   => 'LIKE',
    )
)

Ou si vous vouliez devenir super chic, vous pouvez le configurer dynamiquement:

$values_to_search = array('single', 'redundant');
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
    $meta_query[] = array(
        'key'       => 'system_power_supply',
        'value'     => $value,
        'compare'   => 'LIKE',
    );
}

Merci beaucoup, mon frère. Je ne peux pas vous dire quel gros mal de tête vous avez résolu.
Rizwan

btw, pourquoi la meta_value contenant des données sérialisées si nous ne pouvons pas interroger via meta_query? Est-ce le bug de wordpress?
Rizwan

1
Je suis une femme, pas un "frère", mais pas de problème. La meta_value contient des données sérialisées en raison de la façon dont Advanced Custom Fields enregistre les données. Ce n'est pas idéal, c'est sûr.
Jen

1
haha, je m'excuse ma dame. Les deuxième et troisième ont bien fonctionné, n'ont pas essayé le premier.
Rizwan

2
vous pouvez supprimer le premier, cela ne fonctionne pas
Toskan

3

Je sais que ça fait longtemps, mais juste au cas où quelqu'un aurait le même problème. Eh bien, j'ai tiré mes cheveux pendant des heures avant de trouver le problème: 'meta_query' avec l'opérateur de comparaison 'IN' ne semble pas accepter le tableau habituel. à la place, vous devez d'abord le joindre avec ','.

Donc, dans votre cas, quelque chose comme ça devrait fonctionner:

$args   =   array(
'posts_per_page'   => -1,
'post_type'     => 'post',
'meta_query'    => array(
    array(
        'key'       => 'system_power_supply',
        'value'     => join(', ', array('single', 'redundant')),
        'compare'   => 'IN',
    )
)
);
$query = new WP_Query($args);
echo $query->found_posts;

Dans WP 5, vous pouvez simplement passer le tableau directement à la clé de valeur. Si vous l'implosez en une chaîne, vous pouvez obtenir des résultats inattendus en ce qui concerne la façon dont wp divise la chaîne en segments pour la IN()pièce. Par exemple, 'this that', 'and', 'that'devient 'this','that','and','that'- il semble donc préférable de simplement lui donner le tableau.
Bananaapple
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.