Excerpt. Ganzer Satz. Punkt.

The times they are a-changin’.

This post seems to be older than 6 years—a long time on the internet. It might be outdated.

Keine Sorge, gleich folgt eine Funktion. Ich muss nur mal kurz ausholen zu einer kleinen Einleitung.
Das WordCamp 2011 in Köln war mein erstes, und es war große Klasse! Ein Haufen Nerds, die Klassentreffen spielen. Da kommen echte Gefühle von Verbundenheit auf gegenüber Menschen, die ich bisher nur als Avatare gesehen hatte. Aber zur Sache.

Robert von inpsyde war am Ende eines anregenden Gesprächs so nett, mir eine kleine Herausforderung mit auf den Weg zu geben: „Mach‘ mir doch mal ’nen excerpt, der nach’m Punkt aufhört, nicht mitten im Satz!“ – Tu‘ ich doch gerne! 

Während 12 Jahren beruflicher Selbständigkeit in verschiedenen Branchen lernt man vor allem eins: Ressourcen nutzen. Wer das Rad dauernd neu erfinden will, kommt selten vorwärts. Roberts Wunsch entsprechend, habe ich also erstmal gegooglet. Und klar, das hat schon jemand vor mir gelöst. Der Kollege heisst Sebastian und hat seinen punktgenauen Auszug hier gepostet. Weil das Ganze in Englisch ist, liefere ich mal eine kurze Übersetzung:

Ausgangsmaterial

Sebastian hat das Ausgangsmaterial seiner Lösung selbst woanders her (s. Kommentare des Originalartikels). Zur Optimierung der Ursprungsfunktion setzt der die PHP-Funktion strrchr ein. Diese sucht in einer limitierten Zeichenkette ($haystack) nach einem bestimmten Zeichen oder einer Zeichenfolge ($needle) und gibt dann den Teil von $haystack aus, der nach $needle kommt:

 string strrchr ( string $haystack , mixed $needle )

Nicht gerade das, was wir hier brauchen. In den Kommentaren bei php.net hat Sebastian glücklicherweise eine kurze Helferfunktion gefunden, die das ganze Ding umdreht: Nun wird der String bis zum letzten Vorkommen von $needle ausgeben.

<?php
function reverse_strrchr($haystack, $needle, $trail) {
    return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) + $trail) : false;
}
 ?>

Funktion

Aufbauend auf dieser Lösung, modifiziert Sebastian nun den WordPress-excerpt. Ich habe nichts verändert, nur ein wenig nachformatiert und die Kommentare übersetzt:

<?php
/* Variable und intelligente Auszugslänge */
function print_excerpt( $length ) { // Maximale Auszugslänge in Zeichen
	global $post;
	$text = $post->post_excerpt;
	if ( '' == $text ) {
		$text = get_the_content( '' );
		$text = apply_filters( 'the_content', $text );
		$text = str_replace( ']]>', ']]>', $text );
	}
	$text = strip_shortcodes( $text ); // Optional, empfohlen
	$text = strip_tags( $text ); // Benutze $text = strip_tags( $text, '<p><a> ' ); wenn du Tags behalten willst 
	$text = substr( $text,0,$length ); 
	$excerpt = reverse_strrchr( $text, '.', 1 ); 
	if( $excerpt ) { 
		echo apply_filters( 'the_excerpt', $excerpt ); 
	} else { 
		echo apply_filters( 'the_excerpt', $text); 
	} 
} 
?>

Diese Funktion, zusammen mit der Helferfunktion davor, gehört natürlich in die functions.php. Im Template lässt sich der optimierte Artikelauszug dann z.B. mit <?php print_excerpt(50) ?> aufrufen, wobei die 50 der Mindestzeichenanzahl entspricht, die berücksichtigt werden soll. Der Auszug endet am Ende des laufenden Satzes. Punkt.

Verbesserungen

Man könnte natürlich einen Default-Wert für $length setzen. Im Moment sieht man gar nichts, wenn der Wert fehlt. Und vor allem könnte man andere Satzzeichen wie „!“ und „?“ als Filter zulassen.
Bei näherem Hinsehen entpuppt sich das Thema sowieso als logische Fallgrube, in der es eine Vielzahl von Szenarien zu analysieren gibt. Was ist zum Beispiel, wenn eine Autor den Punkt als Tausender-Trennzeichen benutzt? Oder, wie die Amerikaner, als Kommaersatz in Kommazahlen? Das wird dann vielleicht mal ein anderer Artikel.

Eine Antwort zu “Excerpt. Ganzer Satz. Punkt.

  1. Danke für den sehr hilfreichen Artikel. Auch wenn dieser schon etwas älter ist, so kann man auch mit WP 3.6.x auf einfache Art den Auszug eines WordPress-Beitrags satzbegrenzt ausgeben.

Kommentare geschlossen.