dynamicinternet Webdesign

Das Blog

Themen, Tutorials sowie Tipps & Tricks über Webdesign, (X)HTML und CSS, Programmierung, WordPress und was uns sonst noch bewegt.

RSS abonnieren

Der Fluch von the_post_thumbnail

So richtig begeistert war ich noch nie von dieser Funktion, obwohl die WordPress Community sich das dringlichst gewünscht hatte. Warum? Die Funktion ist sehr resourcenhungrig. Auf einer normalen Blogseite mit 10 Posts kommen durch diese Funtion 2 zusätzliche Anfragen an die Datenbank hinzu.Jetzt hatte ich folgenden Fall: Ich habe eine Hauptseite, die wiederum Unterseiten hat. Diese Unterseiten listen dann in einer Übersicht ihre jeweiligen Unterseiten mit dem Post Thumbnail und ein paar benutzerdefinierten Feldern. So eine Art Index halt, nichts Spannendes. Nur die Anzahl der gelisteten Unterseiten ist teilweise schon heftig. Auf einer Seite sind es 73 Einträge.

Also nach meiner Rechnung zusätzliche 146 Queries durch die Post Thumbnails plus ein paar durch die Seite selber. Mich hat aber der Schlag getroffen: 372 Queries !!! Ich habe Frank Bültges Plugin Debug Queries aktiviert mir die Queries einmal ausgeben lassen.

Query: SELECT * FROM wp_posts WHERE ID = 15 LIMIT 1
Call from: require, require_once, include, the_post_thumbnail, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_src, image_downsize, wp_attachment_is_image, get_post
 
Query: SELECT `post_parent` FROM wp_posts WHERE ID = 12 LIMIT 1
Call from: require, require_once, include, the_post_thumbnail, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_src, image_downsize, wp_attachment_is_image, get_post, _get_post_ancestors
 
Query: SELECT `post_parent` FROM wp_posts WHERE ID = 221 LIMIT 1
Call from: require, require_once, include, the_post_thumbnail, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_src, image_downsize, wp_attachment_is_image, get_post, _get_post_ancestors
 
Query: SELECT `post_parent` FROM wp_posts WHERE ID = 8 LIMIT 1
Call from: require, require_once, include, the_post_thumbnail, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_src, image_downsize, wp_attachment_is_image, get_post, _get_post_ancestors
 
Query: SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (15)
Call from: require, require_once, include, the_post_thumbnail, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_src, image_downsize, wp_attachment_is_image, get_attached_file, get_post_meta, get_metadata, update_meta_cache

Warum WordPress in jedem Durchlauf die post_parents abklappert, ist mir schleierhaft.

Ich werde wohl oder übel eine Funktion schreiben müssen, denn so geht es nicht. Selbst die “normalen” 150 Queries sind zuviel.

9 Kommentare
  1. Dieter sagt:

    @Micha
    Ich nutze the_post_thumbnail nicht.

    Kann man das Abschalten, damit die Zahl der Datenbankabfragen kleiner wird?

    Habe ich das richtig verstanden, dass Du da eine Funktion schreiben willst, die diese Datenbankabfragen beseitigt?

  2. Micha sagt:

    Entweder du nutzt the_post_thumbnail im Template und hast die Datenbankabfragen, oder du nutzt die Funktion nicht, dann hast du keine, aber auch keine Thumbnails.

    WordPress speichert in der Tabelle post_meta die Thumbnail ID. Ich werde 2 Sachen machen. Eine Funktion, die den Pfad, das Thumnail und alles was ich noch so brauch, in einem benutzerdefinierten Feld speichert. Und eine Funktion, die die Daten holt und das Bild ausgibt. Da die benutzerdefinierten Felder eh mit der Post geholt werden, benötigt es keine zusätzliche Datenbankabfrage. Die Speichern Funktion brauch ich dann bloß noch an wp_insert_post usw. hängen, dann wird das Bild auch updated, falls das einer mal macht.

  3. Dieter sagt:

    Danke Micha! Super erklärt. So versteht das auch ein Nichtprogrammierer wie ich.

  4. Markus sagt:

    Machte es früher auch mit benutzerdefinierten Feldern und das mehr an DB-Abfragen hat mich auch gleich gestört. Trotzdem nutze ich es, bei mir werden die Bilder gecached und so ist pro Bild nur einmal eine Abfrage nötig, nämlich die erste solang es nicht im Cache liegt und dann nie wieder.

    Den Cache hab ich nach dem Prinzip von Tanja gebastelt:

    http://www.crazytoast.de/2009/04/bloggen/php-cache-script-wordpress-datenbank.html

  5. Die einfachste Lösung heißt doch: Queries cachen, oder? Dafür gibt es schon ein hilfreiches Plugin, das ich oft und gerne benutze:
    http://wordpress.org/extend/plugins/db-cache-reloaded/

  6. sonja sagt:

    Hallo, auch wenn es nur bedingt zum Thema gehört, könnt Ihr mir vielleicht helfen? Ich möchte für meinen Blog das folgende Theme verwenden
    web2feel.com/eminent/
    und habe
    add_theme_support(‘post-thumbnails’);
    auf functions.php eingebunden.

    Trotzdem werden mir noch keine Thumbnails angezeigt, weder im Slider oben, noch in den Posts auf der Startseite. Die folgende Anleitung fand ich sehr gut ( http://www.kremalicious.com/2009/12/wordpress-post-thumbnails/ ), allerdings hänge ich jetzt bei Schritt 3 fest und habe keine Ahnung, wo ich ( ) einfügen muss.

    Bin für jede Hilfe dankbar!!

    LG
    Sonja

  7. Dieter sagt:

    @Thomas
    Das ist die einfachste, aber nicht die beste Lösung.

    Die beste Lösung heißt für mich Queries auf das erforderliche Maß beschränken und dann diese zu cachen.

    PS: DB Cache Reloaded setze ich auch ein und kann ich definitiv empfehlen.

  8. Micha sagt:

    @Markus @Thomas: Ich werde mir das Cachen einmal anschauen.

    Es ändert aber nichts an der Tatsache, das die Entwickler irgendwas verrissen haben.

  9. Micha sagt:

    Mit der Funktion ist noch mehr faul.

    Mal angenommen, ihr habt in den Einstellungen Media die medium size auf 300×200 gestellt.
    Mal weiter angenommen, ihr habt ein Bild mit 1600×1200 hochgeladen. Jetzt ratet mal, welches Bild runterskaliert wird, wenn ihr the_post_thumbnail(array(400, 250)) ausgeben wollt….

Einen Kommentar schreiben