Für Menschen · Seien Sie begeistert und Sie werden begeistern !
WordPress wird mitunter nicht nur als Blogplattform eingesetzt; denken wir an die Anwendung CMS oder Präsentation von Fotos, so sind das nur einige wenige aus der großen Auswahl. Nicht selten will man dabei für die unterschiedlichsten Abhängigkeiten ein anderes Design laden. So hat meist der Photoblog ein anderes Design als der Weblog.
Im Grunde kann man das recht einfach machen und nicht immer muss man dazu eine umfangreiche Abfrage in die Templates bauen oder gar verschieden Installation von WordPress einrichten. Ebenso kann man sich mit der folgenden gezeigten Lösung mehr Übersicht der getrennten Themes erarbeiten. Im Zuge eines individuellen Designs, wie es beispielsweise bei Nico oder Gerrit diskutiert wird, hat man so recht viele Möglichkeiten.
Mit der kommenden Version von WordPress wird es dazu einen Template Tag geben - body_class(), der diverse Klassen dem body-Tag zuordnet, damit wird die Induvidialität gefördert, oder auch die Syntaxmenge. Hintergründe hat Michael berichtet, inklusive aller möglichen Klassen. Alternativ kann man bei Andrew nachlesen, der die neue Funktion auch schon analysiert hat.
<body <?php body_class(); ?>>
Die Ausgabe könnte dann beispielsweise wie folgt aussehen.
<body class="page-template page-template-tutorial-php logged-in">
Aber auch ohne das Warten auf WordPress 2.8 und das Suchen der Klassen gibt es eine schöne und saubere Lösung, wie ich finde. Ich trenne dazu die entsprechenden Themes, wenn es sich um extreme Unterschiede handelt, so zum Beispiel zwischen Weblog und Photoblog. In diesem Fall frage ich die Kategorie ab, die nur für Bilder da ist und aktiviere dann ein anderes Theme für die Ausgabe im Frontend.
Mit dieser Grundidee kann man recht viel anstellen und so habe ich mal einige Beispiele aus meinen bisherigen Anwendungen gelistet, wählt selbst, welche Möglichkeiten ihr nutzen möchtet.
Um die Möglichkeit zu nutzen, lagert ihr die Funktion entweder in die functions.php des Themes aus, welches im Backend von WordPress auf Aktiv gesetzt ist, oder ihr speichert es als Plugin. Auch dafür habe ich ein wenig vorbereitet und so findet ihr mein kleines Plugins, welches nur via Code zu ändern ist, also keine Options-Oberfläche mitbringt, auf der entsprechenden Seite zum Plugin „User Theme“.
function fb_user_theme( $template = '' ) {
// de_DE: Leerzeichen im Namen des Themes muessen mit _ (underline) ersetzt werden!
// when Profil-ID
if ( get_profile('ID') == 123 ) {
$template = 'default';
}
// when IP
if ( $_SERVER['REMOTE_ADDR'] == '127.0.0815.1' ) {
$template = 'classic';
}
// when User_Level
// @see http://codex.wordpress.org/Roles_and_Capabilities#Roles
if ( current_user_can('level_10') ) {
$template = 'classic';
}
elseif ( current_user_can('level_5') ) {
$template = 'classic';
}
elseif ( current_user_can('level_2') ) {
$template = 'default';
}
// when category with ID
if ( in_category('1') ) {
$template = 'default';
}
return $template;
}
add_filter('template', 'fb_user_theme');
add_filter('stylesheet', 'fb_user_theme');
Im Grunde ist es ganz einfach: wenn eine entsprechende Bedingung wahr ist, wie zum Beispiel Kategorie mit der ID 1, dann wird das default-Theme geladen, ansonsten wird immer das Theme geladen, welches im Backend aktiv ist.
In der Funktion wird als der Name des Themes an die Variable $template übergeben und mit Hilfe der beiden Filter wird das Template und das Stylesheet des übergebenen Theme-Namen aktiviert.
Der übergeben Name des Themes kann in der Beschreibung Leerzeichen enthalten, die hier in der Funktion mit _ (underline) ersetzt werden, bitte daran denken, sonst erkennt WordPress das Theme nicht.
Mit diesen kleinen und einfachen Möglichkeit kann man viele Umwege sparen, Installationen von WordPress zusammenfassen und behält trotzdem eine saubere Trennung der Themes. In der Funktion können natürlich alle Arten von Conditional Tags (Hinweise dazu: hier und hier) genutzt werden und so ist auch denkbar, dass statische Seiten oder Beiträge mit bestimmten Tags ein anderes Design erhalten.
Ich bin urlaubsreif, ersticke in Arbeit und damit auch für die Leser des Weblogs nicht zu erreichen. Bitte geduldet euch ein wenig mit Supportanfragen.
Leider muss ich die Kommentarfunktion deaktivieren, ansonsten würde ich weiter in Arbeit ersticken oder die Anfragen nicht nach bestem Gewissen beantworten.
Vielen Dank für das Verständnis!
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 854 Beiträge, 15036 Kommentare in 14 Kategorien und 450 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet.
Design und Code ist unter Copyright
© 2001 - 2010 bueltge.de [by:ltge.de]
10. Februar 2009 um 14:11
Kleiner Syntax-Fehler: Das if sollte wohl eher eine Zeile tiefer, sonst gibts ja einen PHP-Fehler!
10. Februar 2009 um 14:27
Hey, das ist ein guter Ansatz, um meinen neuen Theming-Spleen, siehe mein Artikel zu Pinball Dreams, zu verfeinern. Ich brauchte kein komplett eigenes Template, sondern nur ein eigenes kleines Extra-CSS. Christian Mücke hat da ein kleines Tutorial erstellt, was ich etwas modifiziert habe.
Primär brauch ich zwei Custom Fields, die einmal den Pfad zum CSS und das CSS selber angeben. Aber ich könnte das wohl noch optimieren, dass man nur ein CF braucht, wenn man die Namen des Pfades und des CSS gleichbehält (wieso komm ich da erst jetzt drauf …?)
Momentan habe ich es etwas dirty in der header.php untergebracht
<?php
if (is_single()) {
$specialTheme = get_post_meta($post->ID, 'specialTheme', $single = true);
$specialCSS = get_post_meta($post->ID, 'specialCSS', $single = true);
if ($specialTheme !=='' || $specialCSS !== '') { ?>
<link rel="stylesheet" type="text/css" media="screen" href="<?php bloginfo('template_url'); ?>/special/<?php echo $specialTheme; ?>/css/<?php echo $specialCSS; ?>.css" />
<?php } else { echo ''; } } >
Eventuell gibt’s da noch Optimierungspotential (außer das oben angesprochene). Insgesamt frag ich noch zwei weitere Custom Fields ab. Einmal eins, was eine Extra-Nachricht für Feed-Leser mitschickt, damit die nicht nur den Feed lesen, sondern sich mal kurz die Seite anschauen, das zweite CF erstellt einen Eyecather auf der Start- bzw. den Archivseiten generiert.
Alles in allem ein Riesenhaufen Arbeit, aber das fetzt, macht Spaß und ist eine Herausforderung. Von meiner Seite aus war das nicht der letzte Artikel dieser Art.
10. Februar 2009 um 14:32
super sache, ganz eindeutig! da hat man schoen viele möglichkeiten ohne, ständig neue template dateien anlegen zu muessen, wenn man mal ein anderes outfit wünscht.
danke fuer die erläuterung!
10. Februar 2009 um 14:54
@gr4y: danke für den Hinweis, gefixt
10. Februar 2009 um 20:26
Klingt sehr interessant und für meine derzeitigen Pläne auch sehr passend.
Damit kann man schön Microsites umsetzen, wenn man WordPress als CMS einsetzt.
10. Februar 2009 um 22:12
wow, wieder eine fantastische möglichkeit wordpress noch mehr zu twisten. toll.
2. März 2009 um 07:33
Guten Morgen,
Irgendwie steh ich auf dem Schlauch oder ich habe einen dicken Denkfehler. Kann auch sein, dass ich einfach noch nicht fitt genug in WP bin
Kannst du mir bitte mal genau den Code sagen und wo ich den dann genau einfügen muss ?
Ich möchte die Themes in abhängigkeit der Kategorie ändern.
Standard Theme ist A
Kategorie 1 - Theme B
Kategorie 2 - Theme C
Vielen Dank
Gruß
Volker
2. März 2009 um 10:07
function fb_user_theme( $template = '' ) { // de_DE: Leerzeichen im Namen des Themes muessen mit _ (underline) ersetzt werden! // when category with ID if ( in_category('1') ) { $template = 'theme_b'; } elseif ( in_category('2') ) { $template = 'theme_c'; } else { $template = 'theme_a'; } return $template; } add_filter('template', 'fb_user_theme'); add_filter('stylesheet', 'fb_user_theme');Das obige Beispiel fragt die beiden Kategorien 1 und 2 ab. Die IDs musst du anpassen. Wenn also Cat 1, dann wird Theme B geladen, Cat 2 - dann Theme C, ansonsten immer Thea A. Den Code in die functions.php des Themes A oder als Plugin auslagern. Im Backend ist Theme A aktiv! Alternativ kann die Abfrage auch in die header.php des aktiven Themes und man nutzt nicht verschieden Themes, sondern ein anderes Design, also bspw. eine andere CSS-Datei. Je nach dem wie flexibel du sein willst, bzw. wie unterschiedlich das Design ist.
11. März 2009 um 21:42
Ok, erstmal Danke soweit.
Mit classic und default theme klappt das auch.
Mit meinem selbstgestrickten Theme leider nicht.
Dazu eine konkrete Frage die vielleicht merkwürdig anmutet:
Der Theme-Name den ich im Code eingebe, entspricht dem Namen des Ordners in dem der Theme liegt oder gibt es da eine Stelle im Themecode an dem ich diesen Namen noch festlegen muss ?
Hast du vielleicht grundlegend eine Idee, was dein "Erkennungs-Code" blockieren könnte ?
Gruß
Volker
12. März 2009 um 11:12
Der Name kommt aus der Bezeichnung in der
style.css, allerdings alles klein und Leerzeichen mit_(underline) ersetzen.SO wie im Text erwähnt.21. August 2009 um 06:02
Guter Tipp - so etwas habe ich gesucht. Ein Theme für jeden Zweck ist manchmal eingeschränkt und sieht nicht so gut aus.
Danke dir!
21. November 2009 um 13:20
Danke für den tollen Beitrag, leider komme ich gerade bei dem Einbau nicht weiter.
Ich würde die Abfrage gerne so verwenden, dass bei Artikeln die in Kategorie 1 abgelegt sind die style1.css verwendet wird, bei Artikeln die in Kategorie 2 abgelegt sind die style2.css verwendet wird, und bei allen anderen Kategorien die ganz normale style.css verwendet wird.
Wie muss ich die Abfrage dazu umbauen - denn leider steige ich selbst da noch nicht so wirklich durch?!
Vielen Dank und ein schönes Wochenende,
Maxi
23. November 2009 um 13:21
@Maxi: Imm einfachsten Fall geht das, in dem du in der header.php eine Abfrage hinterlegst, schau dir mein Bsp. mal an:
<?php if ( in_category('cat-1') ) { ?>
<link rel="stylesheet" href="<?php bloginfo('stylesheet_directory'); ?>/css/cat-1.css" type="text/css" media="screen" />;
<?php } elseif ( in_category('cat-2') ) { ?>
<link rel="stylesheet" href="<?php bloginfo('stylesheet_directory'); ?>/css/cat-2.css" type="text/css" media="screen" />;
<?php } else { ?>
<link rel="stylesheet" href="<?php bloginfo('stylesheet_directory'); ?>/css/default.css" type="text/css" media="screen" />;
<?php } ?>
1. Dezember 2009 um 10:24
Hallo,
also so richtig verstehe ich das noch nicht. Ich habe jetzt eine Wordpres 2.8.6-Version. Wie kann ich den nun für jede Kategorie ein anderes Template benutzen. Kennt jemand ein ausführliches Tutorial?
Danke Heiko
1. Dezember 2009 um 11:04
@Heiko: Dazu erscheint in den kommenden Tagen ein Beitrag, denn mit WordPress 2.9 wird das sehr einfach; ebenso gibt es dann Hinweise auf WP kleiner 2.9; wenn du nicht warten kannst, dann nutze den Conditional Tag
in_category()und Frage deine Kategorie ab, mehr ist nicht notwendig.7. Februar 2010 um 16:19
Gibt es denn den von dir erwähnten Beitrag schon? Ich suche nämlich seit längerem nach der Möglichkeit ein eigenes Theme pro Kategorie festzulegen.
8. Februar 2010 um 09:23
@Lessthan: Das geht doch mit der Lösung: die Abfrage auf die Kategorie und auf das Theme verweisen, oder ein Stylesheet; wenn ein Template reicht, dann geht das auch einfach mit dem Namen im Template
20. Februar 2010 um 20:44
Hallo Frank,
bei mir in 2.9.2 läd er zwar das richtige Style Sheet, nicht jedoch das richtige Theme. Dort wird der Code des im Backend hinterlegten Themes geladen. Das Ganze sieht dann sehr zerschossen.
Beide Filter sind gesetzt:
add_filter('template', 'fb_user_theme');add_filter('stylesheet', 'fb_user_theme');
Hast Du eine Idee?
Grüße
Marco
20. Februar 2010 um 20:53
@Marco: Schaue mal das Plugin an, eventuell passt da was nicht - die Filter sollten passen, ohne jetzt im Code zu prüfen.
20. Februar 2010 um 21:46
Danke, läuft nun!
21. Februar 2010 um 00:08
Eine Frage habe ich hier noch:
Das Plugin funktioniert soweit bei den User-Rollen. Bei Kategorien kommt's weiterhin zum Fehler. Wie ist der template_tag mit der Kategorie zu verstehen? Ich nutze die Cat-ID. Meine gewünschte Kategorie hat die Nummer 161.
if ( in_category("161) ) {
$template = 'default';
error_log("if");
} else {
$template = 'default';
error_log("else");
}
Leider geht der Filter pro URI mal in den IF und mal in den ELSE-Blog. Daher auch das krude Design als Ergebnis.
22. Februar 2010 um 12:35
@Marce: Codex zum Tag und achte darauf, das die ID zw. den '' steht oder du die '' weg lässt.
22. Februar 2010 um 17:18
Ja, war bloß ein Tippfehler. Beide Varianten mit ohne und Anführungszeichen führen dazu, dass eine Blog-URL zu ca. 20 Error-Log-Einträgen führt. Einige leider mit dem Output "else". Das Design ist dann kaputt, weil eben nur 17x statt 20x der Template-Filter ausführt wird.
Noch eine Idee? Mittlerweile schreibe ich händisch eine Whitelist in das Plugin, welche Artikel mit dem default-Plugin versehen werden sollen.
22. Februar 2010 um 22:29
@Marco: Habe eben nochmal geschaut, Hooks sind OK - daher muss wenn dann der Fehler woanders liegen. Wichtig ist, dass du trennst zw. den Conditional Tags is_category und in_category.