J'ai une liste d'identifiants de messages et j'ai besoin d'obtenir toutes les données standard plus la vignette des messages. Comme il y aura plusieurs centaines de messages, j'ai besoin d'un moyen efficace pour récupérer les données, en passant en boucle sur tous les identifiants et en utilisant has_thummbnail ... et toutes les autres versions de la même approche "un par un" ne fonctionneront pas assez rapidement.
La question est donc:
comment puis-je récupérer plusieurs publications avec leur URL miniature sans faire une requête pour chaque identifiant?
UPDATE:
Comme cybmeta l'a fait remarquer avec les publications liées, get_post_meta ne crée pas de requête de base de données supplémentaire. Cette fonction permet de récupérer les champs personnalisés d'une publication.
MAIScela ne me donne toujours pas l'URL de la vignette, mais seulement l'ID de la vignette. Lors de l'extraction de l'URL par l'une des méthodes possibles ( wp_get_attachment_image_src , wp_get_attachment_metadata , ...), je crée une requête DB supplémentaire pour chaque vignette, car ces fonctions ne prennent pas plusieurs ID!
Question plus spécifique:
Comment puis-je récupérer l'URL de plusieurs vignettes via leur identifiant dans une requête
EXPLICATION
Comme indiqué dans la mise à jour ci-dessus, pour récupérer l'ID d'une vignette, la fonction get_post_meta peut être utilisée sans surcharge de base de données. Le moyen "normal" d'obtenir l'URL vers un identifiant de vignette est avec wp_get_attachment_image_src ou des fonctions similaires, mais celles-ci n'acceptent pas un tableau d'identifiants.
Ce que j’ai remarqué en utilisant (wp_get_attachment_image_src}, c’est qu’il a même créé DEUX requêtes par appel (par vignette), une pour obtenir les données de la publication, puis une autre pour l’url réelle.
SOLUTION
La seule solution que j’ai trouvée pour récupérer plus d’une URL à la fois était d’interroger directement la table DB postmeta via wpdb .
Il y a une entrée postmeta pour la relation post-> miniature avec le meta_key_thumbnail_id et l'identifiant de la vignette comme le meta_value puis deux. plus d'entrées par vignette avec les meta_tags _ {_wp_attachment_metadata et _wp_attached_file et l'identifiant de la vignette comme le post_id.
Donc, la partie intéressante de la table postmeta ressemble à ceci:
meta_id post_id meta_key meta_value
328 136 _wp_attached_file 2015/01/Dog-w-Glasses.jpg
329 136 _wp_attachment_metadata a:5{s:5:"width";i:...
...
335 138 _thumbnail_id 136
avec 138 étant l'identifiant de la publication et le meta_id étant sans importance pour cet exemple.
Comme le _thumbnail_id était lié au post_id, il pouvait être récupéré via get_post_meta, mais comme l'URL réelle était stockée sous l'ID de vignettes, elle devait être récupérée séparément.
Donc, ce que j'ai fait était de récupérer tous les identifiants de vignettes pour chaque message via get_post_meta puis de créer une requête sur la table postmeta de la base de données WP:
$thumb_ids = '( 23, 89, 24, 69 )'; // just an example
global $wpdb;
$qstr =
"SELECT post_id, meta_value
FROM $wpdb->postmeta
WHERE post_id IN " . $thumb_ids. ' AND meta_key = "_wp_attached_file"';
$results = $wpdb->get_results( $qstr, ARRAY_N );
cela retournera les résultats sous la forme d'un tableau non associatif, voir la page wpdb pour plus d'informations sur les paramètres de cette fonction.
De cette façon, un seul appel supplémentaire à la base de données est utilisé pour extraire toutes les URL de toutes les publications.
p.s .: J'ai utilisé Moniteur de requêtes et Barre de débogage pour analyser les requêtes de base de données.