J'utilise Advanced Custom Fields pour ajouter des méta-informations à un type d'article personnalisé. Dans ACF, j'ai créé deux listes déroulantes "Sélectionner" différentes. L'une s'appelle "série", l'autre "classification".
Je lance une requête pour afficher toutes les publications avec le terme 'série' 'Compilation' en utilisant ce code:
<?php
$args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
array(
'key' => 'series',
'value' => 'Compilation',
),
),
);
$loop = new WP_Query($args_post);
while ($loop->have_posts() ) : $loop->the_post();
?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
Et il affiche les résultats corrects parfaitement.
Cependant, lorsque vous essayez une requête avec le terme 'classification' 'Données' en utilisant ce code:
<?php
$args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
array(
'key' => 'classification',
'value' => 'Data',
),
),
);
$loop = new WP_Query($args_post);
while ($loop->have_posts() ) : $loop->the_post();
?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
Ensuite, il ne retourne rien. Je l'ai essayé avec d'autres termes dans chaque domaine - les termes "série" fonctionnent parfaitement, alors qu'aucun des termes "classification" ne fonctionne. J'ai vérifié deux fois que je n'avais pas fait quelque chose d'aussi stupide que d'oublier d'appliquer le modèle de page aux bonnes pages ou d'associer les publications aux termes, mais tout a l'air d'être censé l'être. J'ai aussi vérifié les fautes de frappe, mais tout a été vérifié.
J'ai fait le code pour les publications en utilisant d'abord les termes "série", puis juste copié-collé et modifié la clé méta et la valeur pour correspondre aux publications "de classification", donc différentes de ces deux modifications mineures (+ nom du modèle de page) le code est identique.
Est-ce que je manque quelque chose d'évident ici?
UPDATE
Alors j'ai compris la chose évidente qui me manquait. Les termes 'série' ne peuvent être qu'une valeur unique, alors que 'classification' permet de multiples sens c'est un tableau. Cependant, je n'arrive toujours pas à comprendre comment afficher les publications correctes. J'ai changé la ligne en 'value' => array('Data'),
mais cela ne semble pas vraiment changer quoi que ce soit. Je ne suis pas sûr que ce soit la bonne approche non plus.
J'ai trouvé une publication plus ancienne montrant ce qui me manquait dans mon code. Il semble donc que je n'ai pas fait une recherche suffisante pour commencer.
Pour tous ceux qui se demandent si je manquais de 'compare' => 'LIKE'
dans la requête, le code ressemblerait à ceci:
$args_post = array('post_type' => 'release', 'orderby' => '_custom', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array(
array(
'key' => 'classification',
'value' => 'Data',
'compare' => 'LIKE',
),
),
);
Tout fonctionne comme un charme maintenant!
UPDATE
Bien que cette solution fonctionne, veuillez noter les commentaires de @ PieterGoosen à la question:
Les comparaisons
LIKE
sont assez coûteuses à exécuter. De plus, les données sérialisées ne sont vraiment pas destinées aux opérations de recherche et de classement. Le problème ici concerne égalementLIKE
: si vous recherchezdot
,mydot
,dot
,dotcom
sont également renvoyésCe que le comparateur
LIKE
fait, il ne cherche pas de valeurs exactes comme le ferait un comparateur comme peut-êtreIN
. Il recherche tout ce qui est susceptible de correspondre au terme. Si vous recherchez une valeur de champ personnalisé de typedot
ou, comme dans votre exempleData
, le comparateur similaire recherchera et renverra tout élément comportant ces 4 lettres dans l'ordre dedata
, de sorte qu'il retourneraData
,data-mining
,database
etcrappy-data
si vous avez ces 4 mots dans la base de données. Donc, ceci rend laLIKE
très peu fiable, raison pour laquelle vous devriez éviter les données sérialisées