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.

Hinterlasse eine Antwort

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

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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