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.