web-dev-qa-db-de.com

Abrufen der URL für das ausgewählte Bild (Miniaturansicht) von mehreren Posts mit einer Abfrage

Ich habe eine Liste mit Beitrags-IDs und muss alle Standarddaten sowie die Miniaturansicht der Beiträge abrufen. Da es mehrere hundert Posts geben wird, brauche ich einen effizienten Weg, um die Daten abzurufen, indem ich einfach alle IDs durchlaufe und has_thummbnail verwende ... und alle anderen Versionen desselben "one by one" -Ansatzes werden einfach nicht schnell genug funktionieren.

Die Frage ist also:

wie kann ich mehrere Posts mit ihrer Thumbnail-URL abrufen, ohne eine Abfrage für jede ID durchzuführen?

UPDATE:

Wie cybmeta mit den verknüpften Posts betont hat, erstellt get_post_meta keine zusätzliche DB-Abfrage und mit dieser Funktion ist es möglich, die benutzerdefinierten Felder eines Posts abzurufen.

ABERdas gibt mir immer noch nicht die URL des Thumbnails, sondern nur die ID des Thumbnails. Beim Abrufen der URL mit einer der möglichen Methoden ( wp_get_attachment_image_src , wp_get_attachment_metadata , ...) erstelle ich für jedes Vorschaubild eine zusätzliche DB-Abfrage, da diese Funktionen nicht mehrere IDs annehmen!

Genauere Frage:

Wie kann ich die URL von mehreren Thumbnails über ihre ID in einer Abfrage abrufen

2
Larzan

ERKLÄRUNG

Wie in meinem Update oben erwähnt, kann zum Abrufen der ID eines Thumbnails die Funktion get_post_meta ohne zusätzlichen DB-Overhead verwendet werden. Der 'normale' Weg, um die URL zu einer Thumbnail-ID zu erhalten, ist mit wp_get_attachment_image_src oder ähnlichen Funktionen, aber diese akzeptieren kein Array von IDs.

Was mir bei der Verwendung von wp_get_attachment_image_src aufgefallen ist, war, dass es sogar ZWEI Abfragen pro Anruf erstellt hat (ergo per thumbnail), eine, um die Post-Daten zu erhalten, und eine weitere für die tatsächliche URL.

LÖSUNG

Die einzige Lösung, die ich gefunden habe, um mehr als eine URL gleichzeitig abzurufen, war die direkte Abfrage der DB-Postmeta-Tabelle über wpdb .

Es gibt einen postmeta Eintrag für die Relation post-> thumbnail mit der meta_key_thumbnail_id und der thumbnails id als meta_value und dann zwei Weitere Einträge pro Thumbnail mit den Meta_Tags_wp_attachment_metadata und _wp_attached_file und der ID des Thumbnails als post_id.

Der interessante Teil der Postmeta-Tabelle sieht also so aus:

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

138 ist die ID des Posts und meta_id ist für dieses Beispiel irrelevant.

Da die _thumbnail_id mit der post_id verknüpft war, konnte sie über die get_post_meta abgerufen werden, da die tatsächliche URL jedoch unter der Miniaturbild-ID gespeichert war, musste sie separat abgerufen werden.

Also habe ich alle Thumbnail-IDs für jeden Beitrag über get_post_meta abgerufen und dann eine Abfrage für die Postmeta-Tabelle der WP -Datenbank erstellt:

$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 );

dadurch werden die Ergebnisse in Form eines nicht assoziativen Arrays zurückgegeben. Weitere Informationen zu den Parametern dieser Funktion finden Sie auf der wpdb-Seite.

Auf diese Weise wird nur ein zusätzlicher DB-Aufruf verwendet, um alle URLs für alle Posts abzurufen.

p.s .: Ich habe Query Monitor und Debug Bar verwendet, um die DB-Abfragen zu analysieren.

3
Larzan