Je dois obtenir un tas de messages avec leurs métadonnées. Bien sûr, vous ne pouvez pas obtenir de métadonnées avec une requête de publication standard, vous devez donc généralement effectuer une recherche get_post_custom()
pour chaque publication.
J'essaie avec une requête personnalisée, comme ceci:
$results = $wpdb->get_results("
SELECT p.ID,
p.post_title,
pm1.meta_value AS first_field,
pm2.meta_value AS second_field,
pm3.meta_value AS third_field
FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
pm1.post_id = p.ID AND
pm1.meta_key = 'first_field_key'
) LEFT JOIN $wpdb->postmeta pm2 ON (
pm2.post_id = p.ID AND
pm2.meta_key = 'second_field_key'
) LEFT JOIN $wpdb->postmeta pm3 ON (
pm3.post_id = p.ID AND
pm3.meta_key = 'third_field_key'
)
WHERE post_status = 'publish'
");
Semble travailler. Il se déclenche si vous utilisez l'un de ces champs méta d'une manière qui autorise plusieurs méta-valeurs pour le même poste. Je ne peux pas penser à une jointure pour faire ça.
Donc, question 1: existe-t-il une jointure, une sous-requête, ou autre, pour importer des méta-champs à valeurs multiples?
Mais question 2: ça vaut le coup? Combien de postmeta
jointures de table dois-je ajouter avant qu'une approche à 2 requêtes devienne préférable? Je pouvais saisir toutes les données de publication dans une requête, puis toutes les publications pertinentes dans une autre et combiner la méta avec les données de publication dans un jeu de résultats en PHP. Cela finirait-il par être plus rapide qu'une requête SQL de plus en plus complexe, si cela est encore possible?
Je pense toujours: "Donnez autant de travail que possible à la base de données." Pas sûr sur celui-ci!
get_posts()
, alors get_post_meta()
pour chacun d'entre eux? @MannyFleurmond, il est difficile de trouver des informations fiables sur la mise en cache intégrée de WP, mais autant que je sache, les choses seraient mises en cache par requête. L'appel au serveur pour récupérer ces données est un appel AJAX, et je ne pense pas que rien d'autre puisse récupérer des données avant.