web-dev-qa-db-fra.com

Récupérer l'URL de l'image sélectionnée à partir de plusieurs publications en une seule requête

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

2
Larzan

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.

3
Larzan