web-dev-qa-db-fra.com

Comment rechercher un tableau stocké dans un champ personnalisé à l'aide de WP_Query?

J'ai un type de message personnalisé appelé "on-air" qui inclut un champ personnalisé appelé "daysonair". Le formulaire pour cela a des cases à cocher pour chaque jour de la semaine.

Lorsque vous ajoutez/mettez à jour une publication, les éléments cochés sont stockés sous forme de tableau dans le champ personnalisé.

Je n'arrive pas à comprendre comment ajouter ce champ personnalisé à ma recherche WP_Query ():

array( 'key' => 'daysonair',
       'value' => 'Thursday',
       'compare' => 'IN' )

J'ai essayé de nombreux types de comparaisons sans succès.

Les données dans la base de données sont:

a:5:{s:6:"Monday";s:6:"Monday";s:7:"Tuesday";s:7:"Tuesday";s:9:"Wednesday";s:9:"Wednesday";s:8:"Thursday";s:8:"Thursday";s:6:"Friday";s:6:"Friday";}

Où tous les jours de la semaine ont été vérifiés. Je cherche juste à voir si jeudi est dans le tableau.

2
Dave Navarro

La recherche dans un tableau sérialisé est difficile et inefficace - c'est-à-dire. lent. Le pur SQL suivant le fera:

SELECT *
FROM `wp_postmeta`
WHERE `meta_key` LIKE 'daysonair'
AND `meta_value` LIKE '%thursday%'
LIMIT 0 , 100

Quelque chose comme ceci devrait obliger WP_Query à faire quelque chose de similaire:

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    array(
      'key' => 'daysonair',
      'value' => 'thursday',
      'compare' => 'LIKE',
    )
  )
);
$q = new WP_Query($args);
var_dump($q);

Mais les requêtes LIKE avec des caractères génériques - %-- - sont très lentes. La requête doit vérifier chaque ligne de la table pour une correspondance.

En outre, cela sera sujet à des erreurs car toute occurrence de "jeudi" correspondra, par exemple, à quelque chose dans une pièce jointe alt texte.

Le problème est qu'une chaîne de sérialisation est une construction PHP. MySQL ne sait pas quoi en faire si ce n'est le traiter comme n'importe quelle autre chaîne.

La seule bonne solution, et je ne sais pas si cela est possible dans votre cas, consiste à modifier le mode de stockage des données dans la base de données. Si vous devez rechercher les données, celles-ci ne doivent pas être stockées sous forme de chaîne sérialisée. Chaque donnée doit être stockée en tant que paire clé/valeur indépendante.

5
s_ha_dum

Une requête LIKE personnalisée sorte de fonctionnera, mais personnellement, je n'y ferais confiance que pour la mise en oeuvre la plus simple (comme l'a dit s_ha_dum dans les commentaires).

Une meilleure solution consiste à créer une taxonomie personnalisée pour "les jours de la semaine" et à exécuter une requête fiscale sur cette base. C'est exactement le genre de chose pour laquelle le système de taxonomie est conçu.

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'days_of_week',
            'field' => 'slug',
            'terms' => 'wednesday'
        )
    )
);
$query = new WP_Query( $args );
1
MathSmath