Pages mit eigenen Kategorien erweitern

Ausnahmsweise erscheint hier ein Artikel, der nicht direkt mit den kostenlosen Versionen von GP oder GB direkt zu tun hat, und trotzdem sehr nützlich ist.

Was sind Taxonomien?

Taxonomien bieten eine zusätzliche Organisations-Ebene an, um Beiträge & Seiten besser zu strukturieren und auffindbar zu machen. Die bekanntesten Taxonomien sind die „Kategorien“ und „Schlagwörter“ in den Beiträgen einer WP-Site.

In WP lassen sich neben den Beiträge (Posts) auch die Seiten (Pages) mit Taxonomien erweitern, allerdings bietet WP hierfür keinen direkten Weg über die Benutzeroberfläche an. Zu den passenden Lösungen komme ich gleich.

Generell können in WP für alle Beitrags-Typen (Posts, Pages oder auch eigene Typen) ein oder mehrere Taxonomien zugewiesen werden. Das gilt auch für Custom-Post-Types (CPT) wie „Filme“ oder „Events“. Hier ein paar Beispiele, wann und wie es sinnvoll ist, nicht nur die Taxonomien von Beiträgen zu nutzen, sondern auch den Seiten und CPT mit eigenen Taxonomien zu versehen:

Beispiel 1 – Eigene Kategorien für Seiten (GP Pro)

Ich benötige für Pages in meinen Projekten z.B. immer dann eine eigene Page-Category, wenn ich über GP-Elements (ein Pro-Feature von GP) bestimmte Layouts, Blöcke oder Hooks nur auf bestimmten Seiten anzeigen möchte:

  • Full-Width Layouts auf Start- & Landingpages, aber Contained-Widths auf Legal Pages (Impressum etc.)
  • Nav-Menu auf Start- & Legal-Pages eingeblendet, aber auf bestimmten Landingpages ausgeblendet
  • Seiten-Title auf Start- & Landingpages ausgeblendet, aber auf Shop-Pages & Blog-Posts eingeblendet

um ein paar Beispiele zu nennen.

Klar, ich kann die Pages in den Display-Rules auch einzeln zuweisen, aber mit einer Page-Category geht’s halt schneller. Denn damit lassen sich mehrere Seiten unter einer Page-Category zusammenfassen, die dann in den Display-Rules eines GB-Elements an Stelle der einzelnen Seiten selektiert werden braucht.

Da die GP-Elements in der kostenlosen Version von GP nicht genutzt werden kann, nenne ich noch ein Anwendungs-Beispiel für die kostenlosen Versionen von GP & GB:

Beispiel 2 – Eigene Kategorien für zusätzliche Beitragsarten (GP Free)

Angenommen, ich möchte auf meiner Site ein Archiv von Filmen anlegen. Hierfür erstelle ich einen Custom Post Type „Filme“, mit Custom Fields für die Parameter „Film-Titel“, „Regisseur“ und „Erscheinungsjahr“.

Für das „Genre“ eines Films soll jedoch eine eigene Kategorie erstellt werden. Denn WP & GP sind von Haus aus in der Lage, in der Archiv-Ansicht eines Post-Types dessen Taxonomien über die URL als Slug, über eine „Brotkrümel-Navigation“ (Breadcrumbs) oder auch als Liste oder „Wolke“ (Tag Cloud) darzustellen. Einige Suchmaschinen mögen es übrigens sehr, wenn die Inhalte einer Website über Taxonomien strukturiert werden.

Ich kann jetzt über den Query-Loop-Block, der in der kostenlosen Version von GB enthalten ist, für alle Filme ein Layout entwerfen, in welchem die Custom-Fields für jeden Film dargestellt werden und die Film-Kategorie “Genre” für die Filterung nutzen. Somit können sich die Website-Besucher z.B. alle Filme der Kategorie “Horror” anzeigen lassen, ohne dass diese Kategorie auch in den Standard-Blog-Posts zu sehen ist!

Lösungsansätze

Um einem Post-Type eine eigene Taxonomie hinzuzufügen, bieten sich verschiedene Lösungen an:

Lösung mit Plugin

  • Pods (kostenlos) – hiermit können nicht nur Taxonomien, sondern auch zunächst die Custom Post Types und sogar Custom Fields & Relations angelegt werden. Stark!
  • TaxoPress (kostenlos) – hiermit werden ausschließlich Taxonomien angelegt & verwaltet. Das Plugin bietet zudem sehr coole Möglichkeiten der automatischen internen Verlinkung, wenn ein Taxonomie-Begriff im Content auftaucht!
  • MetaBox (kostenpflichtig) – unsere Allzweckwaffe für alles, was mit eigenen Beitragstypen, Feldern, Taxonomien etc. zu tun hat. Flagschiff!
  • Weitere kostenlose Lösungen können über das WP-Plugin-Repo gefunden werden

Lösung mit PHP

Die vermutlich schlankeste Lösung dürfte die Implementierung einer Custom Taxonomie über ein Child-Theme oder ein Code-Snippet-Tool sein. Wir verwenden häufig das bekannte „Code Snippets“ Plugin, am liebsten aber das geniale und etwas neuere „WPCodeBox“ Plugin, mit dem sich sämtliche auf allen Websites eingesetzten Code-Schnipsel zentral verwalten lassen.

Jetzt brauchen wir nur noch den Code, um die Taxonomie zu generieren. Wer den nicht von Grund auf programmieren will, findet mit dem kostenlosen „Taxonomy Generator“ von MetaBox.io eine besonders komfortable Methode.

Alternativ könntet ihr den Taxonomy Generator von WPSkills nutzen, wo es noch 20 weitere Generatoren für andere Funktionen gibt, oder den Generator von GenerateWP.

Dort trage ich zunächst den gewünschten Begriff im Plural & Singular ein, z.B. “Filme” & “Film”. Im Feld “Function Name” kann ich ebenfalls einen eigenen Begriff nehmen, oder den Vorschlag übernehmen.

Im Reiter “Advanced” kann ich verschiedene Parameter für diese Taxonomie einstellen. Für die beide oben genannten Beispiele sollten auf jeden Fall die folgenden Häkchen aktiviert sein:

Public – damit die Taxonomie in GP-Elements ausgewählt werden kann
Show UI – damit die Taxonomie überhaupt im Dashboard erreicht werden kann, zumindest über die URL /wp-admin/edit-tags.php?taxonomy=taxname&post_type=page
Show in menu – damit die Taxonomie im Dashboard nicht nur über die URL, sondern auch über den gleichnamigen Menüpunkt geöffnet werden kann
Show on edit page – nicht zwingend wichtig, aber hiermit kann die Taxonomie über Quick-Edit in der Pages-Übersicht zugewiesen werden
Show admin column – ebenfalls nicht zwingend, bietet aber die Möglichkeit, in der Pages-Übersicht die einer Page zugewiesenen Taxonomie anzeigen zu lassen
Hierarchical – hiermit können im Editor & Quick-Edit die Taxonomien bequem über Checkboxes zugewiesen werden (ansonsten muss man immer die ersten 3 Buchstaben eingeben, was erst ab einer Anzahl von 20+ Taxonomie-Einträgen sinnvoll ist).

Im Reiter “Post Types” kann dann eingestellt werden, ob die Taxonomie für Posts, Pages oder beide Post-Types erstellt werden sollen, doch Vorsicht: an dieser Stelle hat der Generator Stand heute einen Fehler, wenn nur “Pages” ausgewählt werden. In dem Fall muss in der vorletzten Zeile ein Zeichen innerhalb des register-arrays entfernt werden:

Statt

register_taxonomy( 'taxname', [ , 'page' ], $args );

sollte dort stehen:

register_taxonomy( 'taxname', [ 'page' ], $args );

Bevor nun der Code im Child-Theme oder Snippets-Plugin eingefügt wird, muss nur noch der opening-tag entfernt werden:

<?php

Hier ein Beispiel-Code für die Taxonomie „PageCat“ für Seiten, nach der hier erwähnten Bereinigung und mit ein paar eigenen Kommentaren für die o.g. Beispiele & Häkchen-Empfehlungen:

add_action( 'init', 'mb_register_category_for_pages' );
function mb_register_category_for_pages() {
	$args = [
		'label'  => esc_html__( 'PageCat', '' ),
		'labels' => [
			'menu_name'                  => esc_html__( 'PageCat', '' ),
			'all_items'                  => esc_html__( 'All PageCat', '' ),
			'edit_item'                  => esc_html__( 'Edit PageCat', '' ),
			'view_item'                  => esc_html__( 'View PageCat', '' ),
			'update_item'                => esc_html__( 'Update PageCat', '' ),
			'add_new_item'               => esc_html__( 'Add new PageCat', '' ),
			'new_item'                   => esc_html__( 'New PageCat', '' ),
			'parent_item'                => esc_html__( 'Parent PageCat', '' ),
			'parent_item_colon'          => esc_html__( 'Parent PageCat', '' ),
			'search_items'               => esc_html__( 'Search PageCat', '' ),
			'popular_items'              => esc_html__( 'Popular PageCat', '' ),
			'separate_items_with_commas' => esc_html__( 'Separate PageCat with commas', '' ),
			'add_or_remove_items'        => esc_html__( 'Add or remove PageCat', '' ),
			'choose_from_most_used'      => esc_html__( 'Choose most used PageCat', '' ),
			'not_found'                  => esc_html__( 'No PageCat found', '' ),
			'name'                       => esc_html__( 'PageCat', '' ),
			'singular_name'              => esc_html__( 'PageCat', '' ),
		],
		'public'               => true, /* selectable in GP-Elements */
		'show_ui'              => true, /* reachable via dashboard-url */
		'show_in_menu'         => true, /* visible in dashboard-menu */
		'show_in_nav_menus'    => false,
		'show_tagcloud'        => false,
		'show_in_quick_edit'   => true, /* visible in quick-edit */
		'show_admin_column'    => true, /* visible in admin-column */
		'show_in_rest'         => false,
		'hierarchical'         => true, /* selectable as checkbox */
		'query_var'            => false,
		'sort'                 => false,
		'rewrite_no_front'     => false,
		'rewrite_hierarchical' => false,
		'rewrite' => true 
	];
	register_taxonomy( 'pagecat', [ 'page' ], $args );
}