WordPress/Kategorie mit eigenem Theme
In WordPress können Sie mit wenigen Schritten einen Unterbereich mit einer eigenen Leitfarbe oder einem eigenem Layout einrichten, der zwar zur Webseite gehört und dessen Inhalte über die Suche erreichbar sind, sich aber durch ein anderes Stylesheet oder gar anderes Template vom Standardlayout abhebt.
Ein solcher Unterbereich könnte aus allen Beiträgen einer bestimmten Kategorie mit der Kategorienübersicht als Hauptseite bestehen.
Inhaltsverzeichnis
Vorüberlegungen
Die Benutzeroberfläche einer Webseite sollte so übersichtlich und zugänglich wie möglich sein. Dazu gehört auch, dass die (Haupt-)Navigation gleich bleibt und und der (meist im Logo befindliche) Backlink im Header immer auf die Startseite und nicht etwa auf die Kategorienübersicht verlinkt. Einen solchen weiteren Zurück-Link könnten Sie z. B. mit einer Breadcrumb-Navigation oder mit einem <p class="secondary-title"></p>
erreichen.
Auf meinen Installationen bin ich einen Kompromiss eingegangen:
- Ich habe eine Klasse im Body hinzugefügt, die bei bestimmten Kategorien als Selektor für ein eigenes Stylesheet dient.
- Da Struktur und Seitenaufbau der Beiträge und Kategorienseiten gleich bleiben, habe ich hier auf eigene Templates verzichtet.
- Allerdings soll der Header bei bestimmten Kategorien individuell gestaltet werden, sodass ich dort in der
header.php
des Child Themes eine if-Abfrage der in category eingebaut habe.
Templatehierarchie
WordPress bietet für verschiedene Seiten wie Startseite, Inhaltsseite, Beitrag oder Kategorienübersicht verschiedene Templates an. Diese werden in einer festen Ordnung abgefragt, wenn die Webseite zusammengestellt wird:
- category-slug.php
- category-ID.php
- category.php
- archive.php
- index.php
Unter einem Slug versteht man die „Titelform“, die lesbare URL-Variante des Namens. Sie besteht normalerweise nur aus Kleinbuchstaben, Zahlen und Bindestrichen. Sie wird für die Permalinks verwendet wird.[1] Sie lässt sich unter Beiträge > Kategorien > bearbeiten als „Titelform“ bearbeiten.
Diese Hierarchie findet sich im erzeugten Code in Form von Klassen im body-Element einer Kategorienübersicht wieder:
<body class="archive category category-hannes category-41 wp-embed-responsive tribe-js">
So sucht WordPress beim Seitenaufbau zuerst nach der category-hannes.php
, die ein Template für diese Kategorie enthalten würde. Falls diese nicht gefunden wird, würde eine category-41.php
gesucht werden. Danach wird das allgemeine Kategorien-Template category.php
und falls auch dies fehlt, ein Archiv-Template wie archive.php
geladen werden. Zuletzt wird die index.php
mit dem Standard-Template zum Zusammenbau der Seite verwendet.
Template für Kategorienseite
Sie können eine Kategorienseite über die Klasse im body-Element mit CSS gestalten oder durch ein eigenes Template erweitern.
Am einfachsten ist es eine bestehende category.php
oder archive.php
-Datei aus dem Parent Theme zu kopieren und in einem Code-Editor als category-name.php
abzuspeichern und dann in den Ordner des Child Themes hochzuladen.
Template für Beiträge
Der oben erwähnte category-slug, bzw die category-ID finden sich allerdings nicht als id oder Klasse auf normalen Beitragsseiten wieder. Deshalb müssen Sie das Template für Beiträge einer bestimmten Kategorie anpassen.
Klasse im Body hinzufügen
Der einfachste Schritt wäre es, jedem Beitrag den Slug als Klasse im body-Element hinzuzufügen. Mit der WordPress-eigenen Funktion body class können Sie dies erreichen[2]:
add_filter('body_class','add_category_to_single');
function add_category_to_single($classes, $class) {
if (is_single() ) {
global $post;
foreach((get_the_category($post->ID)) as $category) {
// add category slug to the $classes array
$classes[] = $category->category_nicename;
}
}
// return the $classes array
return $classes;
}
Kopieren Sie das Code-Snippet in die functions.php im Child Theme.
Einziger Schönheitsfehler ist der unterschiedliche Klassenname slug bei Beiträgen und category-slug bei der Kategorienseite.
single.php
Die serverseitige Zusammenstellung von Beitragsseiten wird von der single.php
erledigt. Möchte man die Artikel einer bestimmten Kategorie anders darstellen als andere (z. B. mit einem speziellen Header), so kann man das ganze wie folgt lösen:
in_category
Die WordPress-eigene Funktion in_category()
überprüft, ob der aktuelle Beitrag zu einer der angegebenen Kategorien gehört[3]
in_category( int|string|array $category, int|object $post = null )
eigene Templates laden
Sie können aber auch mit einer Abfrage die Kategorie überprüfen und dann entsprechende eigene Templates zuweisen[4]:
<?php $post = $wp_query->post;
if ( in_category('41') ) {
include(TEMPLATEPATH . '/single_kategorie1.php');
} else if(in_category('42')) {
include(TEMPLATEPATH . '/single_kategorie2.php');
} else if (in_category ('chronik')){
include(TEMPLATEPATH . '/single_chronik.php');
}
else {
include(TEMPLATEPATH . '/single_standard.php');
}
?>
Dabei können Sie sowohl die ID der Kategorie als auch den slug verwenden.
Weblinks
- WordPress.org: Category Templates
- wpbeginner: How to Create Category Templates in WordPress
- perun.net: Spezielles WordPress-Template für ein bestimmtes Kategorie- oder Schlagwort-Archiv Thordis am Freitag, 23. August 2013
Quellen
- ↑ codex.wordpress.org: Glossary: slug
- ↑ forum.wpde: Template für alle Seiten bestimmter Kategorien
- ↑ developer.wordpress.org: in_category()
- ↑ perun.net: WordPress-Artikel einer bestimmten Kategorie sollen ein eigenes Template erhalten