WordPress: Verschiedene Längen für die Kurzfassung

Eines der schönen Features an WordPress ist, dass es aus einem längeren Text automatisch eine Kurzfassung generieren kann (im Englischen „excerpt“ genannt). Die Kurzfassung wird normalerweise auf Übersichtsseiten wie der Startseite, der Suchergebnis-Seite oder Kategorie-Archiven angezeigt. In den WordPress-Einstellungen kann man zudem festlegen, ob im Feed der ganze Beitrag oder ebenfalls die Kurzfassung angezeigt werden soll. Mehr kann man zur Kurzfassung leider nicht einstellen: WordPress nimmt immer die ersten 55 Wörter des Beitrags. Im Folgenden soll es um Möglichkeiten gehen, die Länge dieser Kurzfassung anzupassen.

Zuerst ein Hinweis: Alle folgenden Code-Schnipsel gehören in die functions.php eures Themes. Wenn ihr ein bekanntes Theme wie Twenty Eleven verwendet, bei dem mit Updates zu rechnen ist, legt lieber ein Child-Theme an, ehe ihr das Original ändert. Änderungen, die sich nicht direkt auf das Theme beziehen (im Prinzip alles außer dem Twenty-Eleven-Ansatz), könnt ihr auch in ein Funktions-Plugin packen. Alle Codes auf dieser Seite wurden mit WordPress 3.3 getestet, funktionieren aber auch mit älteren und neueren WP-Versionen. Das Funktionspräfix „abc_“ bitte durch ein Präfix eurer Wahl ersetzen um Kollisionen mit den Namen existierender Funktionen zu vermeiden!

Der Normalfall

Im Normalfall passt man die Länge der automatischen Kurzfassung so an:

/**
 * Sets the post excerpt length to 42 words.
 *
 * @param int $length The current excerpt length.
 * @return int The new excerpt length in words.
 */
function abc_excerpt_length($length) {
  return 42;
}

add_filter('excerpt_length', 'abc_excerpt_length');

WordPress bietet zum Ermitteln der Länge des Excerpts einen Filter an. Der Standard-Wert von 55 wird als Parameter übergeben, kann von der sehr simplen Funktion aber ignoriert werden. Sie gibt einfach den neuen Wert zurück, hier 42.

Twenty Ten und Twenty Eleven

Die beiden Standard-Themes Twenty Ten und Twenty Eleven sind etwas speziell: Sie filtern den Excerpt-Wert selber, um Child-Themes ein leichteres Überschreiben zu ermöglichen. Das führt leider dazu, dass obiger Code keinen Effekt hat. Hier muss man den alten Filter erst entfernen und dann selber einen Wert setzen:

/**
 * Sets the post excerpt length to 42 words.
 *
 * @param int $length The current excerpt length.
 * @return int The new excerpt length in words.
 */
function abc_excerpt_length($length) {
  return 42;
}

remove_filter('excerpt_length', 'twentyeleven_excerpt_length');
add_filter('excerpt_length', 'abc_excerpt_length');

Das funktioniert soweit, vor unserer eigenen Funktion wird aber immer noch die Twenty-Eleven-Funktion aufgerufen (für Twenty Ten heißt der zu entfernende Filter natürlich „twentyten_excerpt_length“). Das macht an sich nichts, aber wenn man sich ein paar sinnlose Funktionsaufrufe sparen will, kann man den remove_filter-Aufruf in die setup-Funktion des Child-Themes verlagern. Der Filter wird dann entfernt nachdem das Parent-Theme ihn hinzugefügt hat. Falls es irgendwelche Probleme gibt, dass nach dem eigenen Filter noch ein anderer Filter den Wert wieder ändert, kann man add_filter als dritten Parameter eine Zahl > 10 mitgeben, z.B. 100. Das sollte garantieren, dass der eigene Wert nicht überschrieben wird.

Verschiedene Längen je nach Kontext

Der Wert für die Länge der Kurzfassung eines Artikels wird nicht etwa in der Datenbank gespeichert. Vielmehr wird der Filter für die Länge der Kurzfassung tatsächlich jedes Mal aufgerufen, wenn eine Kurzfassung eines Artikels generiert wird. Das gibt uns interessante Möglichkeiten, für verschiedene Gelegenheiten verschiedene Längen zu generieren. Im Folgenden ein paar Beispiele. Mehr Conditional Tags finden sich im Codex.

/**
 * Sets the post excerpt length to 60 words, except for some pages.
 *
 * @param int $length The current excerpt length.
 * @return int The new excerpt length in words.
 */
function abc_excerpt_length($length) {
  // startpage
  if (is_home()) {
    return 5;
  }
  // search result page
  if (is_search()) {
    return 10;
  }
  // in the feed
  if (is_feed()) {
    return 20;
  }
  // on every other page
  return 60;
}

add_filter('excerpt_length', 'abc_excerpt_length');

In obigem Beispiel werden unterschiedliche Längen für die Startseite, die Suchergebnisseite, den Feed und alle anderen Seiten verwendet. Dies kann man unter Verwendung oben verlinkter Conditional Tags so feingranular gestalten, wie man möchte. Übertreiben sollte man es nicht dabei, aber der Startseite oder dem Feed eine andere Länge für die Kurzfassung zu geben, mag durchaus Sinn machen.

5 Gedanken zu „WordPress: Verschiedene Längen für die Kurzfassung

  1. Hat gut funktioniert. Zum erstenmal habe ich jetzt überhaupt Excerpts in meinen Kategorien. Und ich kann die Länge bestimmen.
    Was mir aber nicht so gefällt: Die Schriftgröße meines Excerpt-Textes ist etwas zu klein. Wie könnte ich die Schriftgröße ändern in der Kategorie?

  2. Das kannst Du ganz einfach über das Stylesheet Deines Themes machen. Normalerweise sollte das Theme an das body-Tag schon eine ganze Reihe Klassen hängen. Ich habe hier auf einer Kategorie-Archiv-Seite z.B. die Klassen „archive category“ am body-Tag. Die Textgröße eines Beitrages auf der Seite kann man im Stylesheet ansprechen mit „body.archive.category article .entry-summary { … }“. Die Details hängen natürlich vom Theme ab.

  3. Danke für die Erklärung, nun ich habe zwar bereits eine Kurzfassung angezeigt, allerdings hätte ich gerne die Bilder die ich quasi über die Artikel setze noch mit drin, wie kann ich das einrichten?

  4. Ich habe für mein Theme die content.php von Twenty Eleven überschrieben (auf diesem Theme basiert mein Child-Theme), um auf allen Übersichtsseiten immer den Excerpt mit dem Artikelbild anzuzeigen. Dazu muss der Beitrag natürlich ein Bild haben, das als Artikelbild markiert ist. Im Code sieht das dann so aus (Ausgabe des Textes mit dem Bild links daneben, die Größe ist Standard und kann im Backend festgelegt werden)… Mist, Code als Kommentar posten klappt nicht wirklich.

    Anyway, schau mal hier:
    http://codex.wordpress.org/Function_Reference/the_post_thumbnail
    Das erste Beispiel ist quasi das, was ich bei mir im Loop stehen habe. Als Größe habe ich noch „thumbnail“ mitgegeben, aber ich weiß gerade auch nicht, ob das nicht Standard ist. Musst Du einfach ausprobieren.

Schreibe einen Kommentar

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

Bitte beachte die Kommentarregeln: 1) Kein Spam, und bitte höflich bleiben. 2) Ins Namensfeld gehört ein Name. Gerne ein Pseudonym, aber bitte keine Keywords. 3) Keine kommerziellen Links, außer es hat Bezug zum Beitrag. mehr Details...

So, noch mal kurz drüber schauen und dann nichts wie ab damit. Vielen Dank fürs Kommentieren! :-)