web-dev-qa-db-fra.com

Deux types de champs personnalisés presque identiques - l'un fonctionne, l'autre pas. Qu'est-ce qui peut causer ça?

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.

1
rpbtz

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 également LIKE: si vous recherchez dot, mydot, dot, dotcom sont également renvoyés

Ce que le comparateur LIKE fait, il ne cherche pas de valeurs exactes comme le ferait un comparateur comme peut-être IN. Il recherche tout ce qui est susceptible de correspondre au terme. Si vous recherchez une valeur de champ personnalisé de type dot ou, comme dans votre exemple Data, le comparateur similaire recherchera et renverra tout élément comportant ces 4 lettres dans l'ordre de data, de sorte qu'il retournera Data, data-mining, database et crappy-data si vous avez ces 4 mots dans la base de données. Donc, ceci rend la LIKE très peu fiable, raison pour laquelle vous devriez éviter les données sérialisées

1
rpbtz