WordPress Seiten & Unterseiten abfragen

WordPress lässt es zu, dass man zu einer Seite (Page) im Backend entsprechende Unterseiten anlegt. Dies ist unter anderem ein Umstand, warum WordPress nicht selten als CMS in der Verwendung ist. Nun will aber mit Hilfe der Conditional Tags diverse Abfragen starten und darauf reagieren - dann sieht man nicht selten im Template statische Abfragen auf jede ID einer Seite. Das geht natürlich anders und einfacher wenn es sich um Seiten oder Unterseite dieser Seite handelt. Mit dieser Lösung kann man dann beispielsweise in Abhängigkeit einer Seite ein spezielles Layout laden und das Frontend so an diverse Anforderungen anpassen. Diese kleine Anforderung nehme ich mal als Beispiel und zeige eine Funktion, die mir die Abfragen zu Seite/Unterseiten gibt und zeige im Anschluss ein Beispiel im Einsatz.

Subpage in WordPress
WordPress lässt es zu, dass man zu einer Seite (Page) im Backend entsprechende Unterseiten anlegt. Dies ist unter anderem ein Umstand, warum WordPress nicht selten als CMS in der Verwendung ist. Nun will man aber mit Hilfe der Conditional Tags diverse Abfragen starten und darauf reagieren – dann sieht man nicht selten im Template statische Abfragen auf jede ID einer Seite.
Das geht natürlich anders und einfacher wenn es sich um Seiten oder Unterseite dieser Seite handelt.

Mit dieser Lösung kann man dann beispielsweise in Abhängigkeit einer Seite ein spezielles Layout laden und das Frontend so an diverse Anforderungen anpassen. Diese kleine Anforderung nehme ich mal als Beispiel und zeige eine Funktion, die mir die Abfragen zu Seite/Unterseiten gibt und zeige im Anschluss ein Beispiel im Einsatz.

Hintergrund

Erstellt man in WordPress eine neue Seite, keinen Beitrag, dann kann man diesen in den Attributen als Unterseite einer bestehenden Seite definieren. Damit lassen sich nicht nur Baumansichten erstellen, sondern auch Strukturen abbilden, die nicht selten in einem CMS benötigt werden.

Subpage in WordPress erstellen

Will man in Abhängigkeit der Seite eine Ausgabe steuern, dann nutzt man den Conditional Tag is_page(),mit welchem man dann die Anforderung umsetzt. Um nun aber nicht für jede Seite diesen Tag zu nutzen und das Template damit ständig anfassen zu müssen, kann man eine einfache Funktion nutzen, die nach Abfragen der Hauptseite auch ein wahr (true) zurück gibt, wenn es sich um eine Unterseite der Hauptseite handelt.

Lösung

Diese Funktion, folgende Syntax, kommt in die functions.php des Themes.


// check ID post and child-post
function has_parent( $post, $post_id ) {
	if ($post->ID == $post_id)
		return true;
	elseif ($post->post_parent == 0)
		return false;
	else
		return has_parent( get_post($post->post_parent), $post_id );
}

Diese kleine Funktion prüft, ob die ausgegeben Seite ein Seite oder Unterseite einer Seite mit der übergebenen ID ist; klingt kompliziert, liegt aber nur am Satzbau. Irgendwie ist es schon zu spät; ja, ich weiß – ihr lest es später, denn ich nutze das zeitversetzte Veröffentlichen. Aber zurück zur Technik. Diese Funktion kann nach dem Ablegen im Theme nun in allen Templates genutzt werden. Das folgende Beispiel prüft, ob es sich um eine Seite oder Unterseite der ID 1 handelt und wenn ja, dann wird das Stylesheet Alternative 1 (alternative_1.css) ausgegeben.

Anderweitig wird auf ID 2 geprüft oder passt keines der Abfragen, dann kommt das Standard-Stylesheet zum Einsatz.

Um die Möglichkeiten noch ein wenig zu erweitern, setze ich in der Abfrage die Variable $bodyclass, die ich im body-Tag zur Ausgabe bringe. Damit habe ich dann eine weitere Anlaufstelle und eine entsprechendes Design je nach Seite zu realisieren.


    <?php
    $bodyclass = '';
    if ( function_exists('has_parent') ) {
	    if ( has_parent($wp_query->post, 1) ) {
	        echo '<link rel="stylesheet" href="' . get_bloginfo('stylesheet_directory') . '/alternative_1.css" type="text/css" media="screen" />' . "\n";
	        $bodyclass = 'class="alternative_1"';
	    } elseif ( has_parent($wp_query->post, 2) ) { 
	        echo '<link rel="stylesheet" href="' . get_bloginfo('stylesheet_directory') . '/alternative_2.css" type="text/css" media="screen" />' . "\n";
	        $bodyclass = 'class="alternative_2"';
	    } else {
	    	echo '<link rel="stylesheet" href="' . get_bloginfo('stylesheet_directory') . '/default.css" type="text/css" media="screen" />' . "\n";
	    }
  	} ?>

</head>
<body<?php echo ' ' . $bodyclass; ?>>

Fazit

Ich denke, dass diese kleine Möglichkeit eine große Wirkung in der Ausgabe haben kann und vielfältige Möglichkeiten zeigt. Ebenfalls kann man diese Lösung mit dem Wechsel des kompletten Theme realisieren, wie ich es schon im Beitrag „WordPress Theme in Abhängigkeit wechseln“ gezeigt habe.
Vielen Dank für das Lesen und noch mehr Danke ich für Verbesserungen zum Beitrag in den Kommentaren.

Comments are closed.