web-dev-qa-db-fra.com

Comment comparer une valeur numérique unique à un tableau de valeurs meta_key?

Il semble y avoir une tonne d'informations sur la vérification d'un meta_key par rapport à un tableau de meta_values, mais je veux faire le contraire.

J'ai un site avec des projets et des revues de presse. Lorsque le client ajoute une révision, il dispose d'un champ personnalisé (ACF) pour sélectionner le projet auquel il se rapporte dans une liste.

J'essaie maintenant d'afficher toutes les revues de presse relatives à un projet donné sur une page. J'ai l'ID du projet et j'utilise une requête avec $ args pour sélectionner les revues de presse que je veux.

Mon $args actuel:

$args = array(
    'post_type'     =>  'pressreview',
    'order'         =>  DESC,
    'meta_query' => array(
        array(
            'key' => 'belongs_to_project',
            'value' => $projectID,
            'compare'   => 'LIKE'
        )
    )
);

Le problème est que ce champ personnalisé 'belongs_to_project' renvoie un tableau avec des identifiants. Une revue de presse peut porter sur plusieurs projets. Je laisse donc le client choisir plusieurs projets dans la liste de ce champ. Un tableau typique sera comme ceci:

Array ( [0] => 210 [1] => 202 ).

Ce que je veux faire, c'est vérifier si le $projectID est dans ce tableau.

Dans la configuration actuelle, cela fonctionne en quelque sorte: si le client a sélectionné 202 et 210 dans la liste, et que le $projectID est 210, la revue de presse est affichée. Cependant, si le $projectID = 20, nous recevons des revues de presse pour les projets 201, 202, 203, etc. (étant donné que ces numéros incluent '20', c'est comment LIKE fonctionne)

Est-il possible de demander à cette requête de ne vérifier que les nombres "entiers"? Pour que "2" affiche uniquement les commentaires pour le projet 2, et non pour 201, 202 ou tout autre nombre comportant un 2?

J'ai vu qu'il y avait une option REGEXP à utiliser à la place de LIKE, mais je ne sais pas comment l'utiliser de manière à ne rechercher que des "nombres entiers".

J'ai aussi essayé 'IN', mais ça ne marche pas du tout ici.

Une chose à laquelle j'ai pensé, mais ne sais pas si c'est possible, est d'utiliser quelque chose comme:

'key' => 'belongs_to_project[$i]'

avec une sorte de boucle dans les valeurs de clé, de sorte que $projectID puisse être vérifié avec '=' au lieu de LIKE par rapport à chacune des valeurs du tableau du champ personnalisé. Je ne sais pas s'il existe une telle option ni comment elle devrait être écrite.

J'espère que mon explication est assez claire, s'il vous plaît laissez-moi savoir si j'ai besoin de mieux expliquer.

3
Els

La solution a été que je dois comparer la valeur littérale de $projectID, de sorte que LIKE compare une chaîne exacte au lieu de simples chiffres. Pour rendre $projectID littéral, il doit être placé entre guillemets.

J'ai donc changé cette ligne:

'value' => $projectID,

à:

'value' => '"'.$projectID.'"',

Ce qui résout le problème.

6
Els

Je crois que vous devriez utiliser IN à compare mais vous avez dit que cela ne fonctionnait pas. et je remarque quelque chose (pardonnez-moi s'il s'agit d'une erreur): vous écrivez exemple pour array

Array ( [0] => 210 [1] => 202 ).

cela signifie que la valeur dans array est NUMERIC et que le type par défaut est 'CHAR'. alors tu peux essayer

$args = array(
    'post_type'     =>  'pressreview',
    'order'         =>  DESC,
    'meta_query' => array(
         array(
            'key' => 'belongs_to_project',
            'value' => $projectID,
            'compare'   => 'IN',
            'type'     => 'NUMERIC'
         )
     )
);
0
Kika