WordPress: Layout pro Artikel definieren
Ich bin ja immer mal wieder dabei ein wenig an unserem Blog rumzuschrauben. Hier und da mal ein kleines neues Feature kann ja nicht schaden. Jetzt wollte ich versuche für einen einzelnen Beitrag das Layout ein wenig zu verändern, um dann zu merken, dass dies gar nicht geht. In WordPress habe ich leider nur die Möglichkeit die Startseite, die Kategorieansicht (für jede Kategorie individuell), das Archiv und die eigentlich Beitragsseite anzupassen. Ein Interview also in einem anderem Layout anzuzeigen wie zum Beispiel die Projektwerkstatt ist nicht möglich. Zumindest sieht WordPress dies nicht vor.
Was also machen? Vor WordPress kapitulieren? Niemals! Ich lass mich doch von so einem Blogsystem nicht in die Knie zwingen. Mir ist natürlich eine gar nicht mal saubere Methode eingefallen, wie man dieses Feature einbauen kann, ohne den WordPress Code zu ändern. Wenn jemand von euch eine bessere kennt, dann her damit. Für den Moment reicht mir meine, aber wer weiss, vielleicht hat ja schon mal jemand mehr Gehirnschmalz als meine 5 Minuten hineingesteckt.
Fangen wir also an. Wir haben keine Möglichkeit zu einem Blogeintrag ein Layout zu definieren, was wir aber sehr wohl haben sind benutzerdefinierte Felder. Diese verwenden wir jetzt einfach dazu das gewünschte Seiten-Template anzusprechen. Einfach ein Feld mit dem Namen „sites“ definieren und zum Beispiel „interview“ als Wert eintragen. Natürlich haben wir jetzt ja noch gar nicht gewonnen. Ein wenig Programmieren müssen wir noch. Als kurze Anmerkung, die Datei, die für die einzelnen Artikel verantwortlich ist nennt sich index.php und ist im themes Verzeichnis zu finden. Und genau diese öffnen wir jetzt. Am besten vorher wegspeichern, falls wir hier Müll bauen. Ich will ja nicht verantworlich sein, wenn auf einmal euer Blog nicht mehr funktioniert. Was ich gemacht habe ist ganz einfach. Ich habe den Code der da vorher stand einfach in eine Datei sites/index.php gepackt und die index.php komplett überschrieben. Und zwar mit diesem Code:
<?php the_post( ); ?>
<?php $site = get_post_meta($post->ID, 'site', true); ?>
<?php
if ( $site != '' ) {
include 'sites/'.$site.'.php';
} else {
include 'sites/index.php';
}
?>
Das war’s auch schon. Wir haben uns einen kleinen DIspatcher gebaut. Wer auf sichergehen will, dass niemand ihn angreift, der sollte nicht direkt $site inkludieren. Das habe ich mir hier aber mal gespart, denn hier im Blog dürfen ja nur die Besten der Besten ihre Artikel veröffentlichen und die sind ja per Definition ja schon toll und würden sowas nie machen. Jetzt fehlt nur noch die Datei interview.php im sites Verzeichnis und schon sind wir da wo wir hin wollten: im Template-Paradies.
Thamtic (ein Framework zum einfachen erstellen von Themes) hat ein tolles Feature: Komplett dynamische Klassen. Das Body Element hat eine ganze Reihe von Klassen, unter anderem ein Artikel-Token, aktueller Browser & Betriebssystem des nutzers und eine menge mehr. Darüber gelöst, könnte man einem einzelnen Artikel ein eigenes Layout verpassen, und müsste nur die CSS-Datei anpacken.
Da ich mein Blog gerade einem Relaunch unterziehe, und für den eigenen Theme Thematic verwende, kann ich das nur wärmstens empfehlen (allein die gefühlt 200 Hooks sind super).
@unset: Vielen Dank werde ich mir mal genauer anschauen. Sollte „Thematic“ heißen denke ich mal, oder?
Äh, ja. Das war vor meinem ersten Kaffee … 😉
Eine kleine Anmerkung vom WordPress-Kenner: Die index.php ist nicht die Seite für einen einzelnen Artikel, sondern für die normale Artikel-Übersicht (die Startseite). Für einzelne Artikel ist die single.php da. Wenn diese nicht vorhanden ist wird die index.php herangezogen und eben nur ein einziger Artikel angezeigt.
@Pascal: Da hast du wohl recht. Hie rnoch mal der Link zu der ganzen Hierarchie:
http://codex.wordpress.org/images/1/18/Template_Hierarchy.png
vielleicht hilfen diese links:
http://codex.wordpress.org/Category_Templates (template pro kategorie)
http://codex.wordpress.org/CSS#WordPress_Generated_Classes (diese css namen werden automatisch generiert)
nach allem was ich mir bisher an „theme-frameworks“ angeschaut habe: es bringt nichts- wordpress templates sind eben so einfach wie simpel wie sie sind und da sie nicht zentral aufgehangen werden („es muss ja auch nicht immer MVC sein“) würde ich mich am bestehenden orientieren, da es auch ständig erweitert wird. es geht ja eh nur um die eine oder andere anpassung.
@Malte: Sehe ich zum Beispiel bei Thematic vollkommen anders. Die Child Themes kommen da in der Regel komplett ohne Anpassungen der PHP-Dateien aus. Für meinen Relaunch musste ich bisher nur einmal an den Post-Title-Filter. Ansonsten komplett über das Stylesheet gelöst.
Im übrigen kann man auch Templates zu Post nutzen, Pluginlösung oder eine Klasse seit 2.7 pro Post ausgeben lassen, so dass man direkt via CSS anpassen kann. Die Lösungen können sehr unterschiedlich sein und man sollte im Vorfeld die Anforderungen gut sondieren.
@unset: thematik< ist etwas, was ich als wordpress theme bezeichnen würde. nur zum verständnis. link: http://themeshaper.com/thematic/
@Malte: Was würdest du denn dann als Framework bezeichnen?
Positiv abgerenzt würde ich als mindestanforderung eine klares Command Pattern fordern, sowie eine View und OutputBuffering. Zumindest was die WordPress Theme angehen würde.