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