Unterschiedliche Templates für Einzelbeiträge

Unterschiedliche Templates für Einzelbeiträge

Mit WordPress kann man den statischen Seiten mit Bordmitteln unterschiedliche Templates zuweisen: Unter dem Menüpunkt Seiten-Template findet sich eine Liste aller verfügbaren Vorlagen. Für Einzelbeiträge funktioniert dies nicht ohne einen kleinen Eingriff – mit kategoriebasierten Conditional Tags lässt sich diese Aufgabe aber elegant lösen. Um anderen die gleiche Suche zu ersparen, habe ich eine kleine Anleitung zusammengestellt.

Die hier beschriebene Lösung macht freilich nur dann Sinn, wenn man das betreffende Layout mehrfach verwenden möchte, denn sie beruht auf der Abfrage der Kategorie: befindet sich ein bestimmter Einzelbeitrag (unter anderem) in der Kategorie X, so soll nicht das Standard-Template single.php, sondern ein anderes zum Einsatz kommen (1). Konkret bin ich auf das Problem gestoßen, weil ich das Plugin Who sees ads? verwenden: damit lässt sich Werbung konditional einblenden – ich binde damit die Banner zwischen Überschrift und Content ein, und zwar so, dass nur Google-Besucher und Gelegenheitsleser marketingtechnisch penetriert werden, datenschmutz StammleserInnen jedoch verschont bleiben von den sensationellen Angeboten, die Zanox & Co. zur Verfügung stellen.

So weit, so gut – doch die Einbindung von Werbung direkt im Beitrag widerspricht den Richtlinien von trigami. Allerdings rufe ich das Plugin im Template auf: wäre ja auch viel zu mühsam, die Zeile in jeden einzelnen Beitrag zu kopieren. Also erschien es mir am sinnvollsten, eine eigene Kategorie für trigami-Reviews zu definieren und Beitragen, die (auch) dieser Kategorie angehören, ein eigenes Single-Template zuzuweisen. Das hat übrigens noch einen weiteren Vorteil: man kann die „das ist eine bezahlte Rezension“-Kennzeichnung gleich direkt ins Template-File einfügen. Hier eine kurze Schritt-für-Schritt Anleitung – die nötigen Informationen dazu hab ich nach einiger Suche gut versteckt im WordPress-Codex gefunden; ein Plugin, das die Page-Template Funktionalität auch für Einzelbeiträge nachrüstet, existiert einstweilen noch nicht – das wär natürlich die eleganteste Variante.

Anderes Template für einzelne WordPress-Beiträge

Die betreffende Abfrage gehört in die single.php-Datei, die sich im Theme-Verzeichnis befindet (2). Bevor diese umgemodelt wird, sollte aber zuerst die neue Kategorie angelegt werden – denn für die Modifikation der single.php benötigt man die ID der betreffenden Kategorie; diese wird übrigens bei der Kategorienliste im Backend in der ersten Spalte angezeigt. Nehmen wir für unser Beispiel mal an, unsere Kategorie für deviantes Design hätte die ID #34. Wir gehen vor wie folgt:

  1. Umbenennen der Datei single.php in single-standard.php.
  2. Erstellen einer zweiten Datei single-anders.php: dabei handelt es sich um die alternative Design-Variante für unsere Einzelbeiträge.
  3. Anlegen einer neuen single.php-Datei mit der Kategorieabfrage:

    post;
    if ( in_category(’34‘) ) {
    include(TEMPLATEPATH . ‚/single-anders.php‘);
    } else {
    include(TEMPLATEPATH . ‚/single-standard.php‘);
    }
    ?>

    Es gibt diese Datei gezippt auch hier als Download: single.php
    Achtung: die Kategorie-ID muss natürlich entsprechend angepasst werden!

So, das war’s auch schon – mehr gibt’s nicht zu tun. Die neue single.php fungiert sozusagen als Weiche: wichtig ist dabei die Abfrage in_category (as opposed to: is_category), die überprüft, ob der betreffende Beitrag zur Kategorie mit der angegebenen ID gehört. Falls ja, so bekommt der Beitrag in unserem Beispiel das Template single-anders.php zugewiesen, wenn nicht, so kommt stattdessen die Vorlage single-standard.php (also die ehemalige single.php) zum Einsatz.

strong>Nochmal Achtung: beim Copy-Pasten unbedingt die Anführungszeichen korrigieren! Und: die Abfrage in_category versteht die übliche Angabe mehrerer durch Beistriche getrennter IDs nicht. Stattdessen muss man auf php zurückgreifen, also:

if ( in_category(’34‘) ) || in_category (15) || in_category (16)

Wer mit der kategoriebasierten Filterung nichts anfangen kann, sollte einen Blick auf das Plugin Custom Post Templates werfen: es überprüft, ob im Template-Verzeichnis eine Datei mit dem Namen single-POSTID (POSTID steht für die ID des einzelnen Beitrags) existiert – falls ja, wird diese für den jeweiligen Beitrag verwendet: so ließe sich problemlos ein myspace-Blog gestalten, in dem jedes Posting völlig anders aussieht :-)


(1) Wer die betreffende(n) Kategorien nur für die Designumstellung benutzen und ansonsten ausblenden will, kann diese problemlos beim Kategorie-Listen-Aufruf ausfiltern, siehe WordPress Codex.

2) Manche Themes haben keine solche single-Datei, sondern benutzen eine Abfrage in der index.php – die hier beschriebene Vorgangsweise funktioniert trotzdem, allerdings muss man natürlich beide single-Varianten erst erstellen.

0 Kommentare
  1. mo.
    mo. sagte:

    hey richie, schöner beitrag. ich hatte mir diese frage auch schon gestellt. was ich schade finde, dass man für seiten einzelne templates aussuchen kann, aber nicht für artikel selbst. dein „tweak“ ist klasse, trotzdem finde ich es erstaunlich, dass diese funktionalität in wordpress nicht standard ist. besonders, wenn man längerer artikel wie anleitungen schreibt, machen abgestimmte templates sinn.

  2. Oliver
    Oliver sagte:

    Ich habe dieses Problem mit einer WordPress Variable gelöst. Ist diese gesetzt, wird in diesem Trigami-Fall keine Werbung angezeigt:

    if(get_post_meta($post->ID, ‚TrigamiArtikel‘)) {
    echo „“;
    } else {
    wp_ozh_wsa(„google-rot“);
    }

    Aber trotzdem danke für deinen Artikel. Mehrere Templates machen natürlich auch an anderer Stelle Sinn.

  3. Tobi
    Tobi sagte:

    Eine super Idee, die ich mir definitiv mal genauer anschauen werde, wenn ich Zeit finde, da es mir durchaus entgegenkommen würde. Nicht zuletzt wegen der „automatischen“ Kennzeichnung…

    Vielen Dank für deine Mühe und das Tut…

    Beste Grüße aus Berlin

    Tobi

  4. Alex
    Alex sagte:

    Super Lösung, genau sowas habe ich gesucht, vielen Dank!

    Woran ich gerade etwas verzweifel: kann man die Abfrage auch so gestalten, dass man mit „child_of“ arbeitet? Also verschiedene Templates für alle Unterkategorien einer Kategorie?

    Beste Grüße,
    Alex

  5. Marco
    Marco sagte:

    Ein Wort: Danke!

    Habe ewig nach einer Lösung dieses Problems gesucht!

    Kleine Anmerkung:

    In deiner Codezeile ist zwischen < und ?php noch eine Leerzeile.

    Grüße

Hinterlasse einen Kommentar

Schreibe einen Kommentar