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 '';
		}
	}
}

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' );

Ü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.

Das könnte auch interessant sein

Schreib einen Kommentar

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