Post-Template-Namen zu post_class() hinzufügen

Bei meinem aktuell in Entstehung befindlichen Theme möchte ich Beiträge mit Post-Templates bereits auf der Blogübersicht anders darstellen. Dafür füge ich den Namen des Post-Templates über den post_class-Filter der Ausgabe von post_class() hinzu. Hier zeige ich euch, wie das funktioniert.

Funktion für Rückgabe des Post-Template-Slugs

Da ich den Namen des Post-Templates noch an anderen Stellen im Theme brauche, schreiben wir zunächst eine eigene Funktion, die den Namen des Post-Templates ermittelt und zurückgibt:

if ( ! function_exists( 'photographia_get_post_type_template' ) ) {
	/**
	 * Returns the post type template slug 
	 * without templates/ dir and .php ending.
	 *
	 * @return string
	 */
	function photographia_get_post_type_template() {
		$template_slug = get_page_template_slug();
		if ( '' !== $template_slug ) {
			/**
			 * Remove »templates/« from slug.
			 */
			$template_slug = str_replace( 'templates/', '', $template_slug );

			/**
			 * Remove .php file ending.
			 */
			$post_type_template = str_replace( '.php', '', $template_slug );

			return $post_type_template;
		} else {
			return '';
		}
	}
}Code-Sprache: PHP (php)

In der ersten Zeile prüfen wir, ob die Funktion photographia_get_post_type_template() vielleicht durch etwas anderes (etwa ein Child-Theme) überschrieben wurde. Innerhalb der Funktion holen wir uns über get_page_template_slug() den Slug des aktuellen Post-Templates. Wenn der Beitrag kein Template hat, gibt der Aufruf einen leeren String zurück. Falls das Ergebnis nicht leer ist, sieht der Template-Slug bei meinem Theme so aus: templates/name-des-templates.php. Den templates/-Teil sowie die .php-Endung brauchen wir nicht – die entfernen wir über zwei Aufrufe von str_replace() und geben den $post_type zurück.

Falls kein Template gesetzt ist, geben wir einen leeren String zurück.

Funktion zum Hinzufügen der Klasse

Kommen wir nun zu der Funktion, die für das Filtern von post_class verantwortlich ist:

/**
 * Add classes to post_class()
 *
 * @param array $classes array with post classes.
 *
 * @return array
 */
function photographia_filter_post_classes( $classes ) {
	/**
	 * Get the post type template name.
	 * Empty string if no template is used.
	 */
	$post_type_template = photographia_get_post_type_template();

	/**
	 * Add post template class if post has a template
	 */
	if ( '' !== $post_type_template ) {
		$classes[] .= "-$post_type_template-template";
	}

	return $classes;
}

add_filter( 'post_class', 'photographia_filter_post_classes' );Code-Sprache: PHP (php)

Über den Aufruf unserer photographia_get_post_type_template()-Funktion holen wir uns den String mit dem Post-Template-Namen oder einen leeren String, wenn kein Template vergeben ist. Wenn wir keinen leeren String zurückbekommen, fügen wir einen neuen Array-Wert in $classes ein und geben das Klassen-Array zurück.

Wenn ein Beitrag nun ein Template hat, wird durch den Aufruf von post_class() im Loop eine Klasse nach dem Muster -templatename-template ausgegeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)