toscho.design
Redaktion, Druck- und Webdesign aus Halle (Saale)

WordPress: Auszug mit bestimmter Zeichenzahl

Die Template-Funktion the_excerpt() kann in der Menge der auszugebenden Worte gesteuert werden. Brauchen wir aber eine feste Zeichenzahl, so müssen wir ein bißchen tricksen.

Für einen Kunden, der in drei Sprachen bloggt und bei gleicher Wortmenge oft sehr unterschiedlich lange Auszüge produziert, habe ich einmal diese Extrafunktion geschrieben:

/**
 * Erzeugt einen Auszug mit genau definierter Zeichenzahl.
 *
 * @param int $chars Menge der Zeichen.
 * @param bool $echo Aus- oder Rückgabe
 * @return string
 */
function excerpt_chars($chars = 100, $echo = TRUE)
{
    global $post; 

    $out = strip_tags($post->post_content);
    $out = substr($out, 0, (int) $chars);
    $out = end_on_word($out) . ' …';
    $out = xwp_autop($out); 

    if ( $echo )
    {
        echo $out;
        return;
    } 

    return $out;
} 

/**
 * Wandelt Zeilenumbrüche in HTML-Code.
 * wpautop() ist hier nicht nötig
 * @source http://photomatt.net/scripts/autop
 * @param string $pee zu formatierender String
 * @param bool $br
 * @return string
 */ 
function xwp_autop($pee, $br=1)
{
    // cross-platform newlines 
    $pee = preg_replace("/(\r\n|\n|\r)/", "\n", $pee);
    // take care of duplicates
    $pee = preg_replace("/\n\n+/", "\n\n", $pee);
    // make paragraphs, including one at the end
    $pee = preg_replace('/\n?(.+?)(\n\n|\z)/s', "<p>$1</p>\n", $pee);
    // optionally make line breaks
    if ($br) $pee = preg_replace('|(?<!</p>)\s*\n|', "<br />\n", $pee);
    return $pee;
}

Diese beiden Funktionen kommen mitsamt der Funktion end_on_word() in die functions.php.

Im Template wird die Funktion dann anstatt des the_excerpt() benutzt:

// Die ersten 200 Zeichen
excerpt_chars(200);

4 Kommentare

  1. [asterix] am 17.01.2010 19:36:

    Ich verstehe das Problem nicht so ganz. Würde es nicht reichen, the_excerpt mit substr zu kürzen? Ich begreife die umständliche Funktion nicht.

    Anscheinend versuchst du mit der zweiten Funktion, Newlines in <br>-Tags umzuwandeln. Würde da nl2br nicht ausreichen?

  2. Thomas Scholz am 17.01.2010 21:00:

    @[asterix]: the_excerpt() kann HTML-Elemente enthalten, wenn das Feld separat befüllt wurde. Da die also ohnehin herausgekürzt werden müssen, umgehe ich die Funktion the_excerpt() komplett. Spart einfach Zeit, und ich bin eventuell später eingeführten Änderungen im Core nicht ausgeliefert.

    Die zweite Funktion erzeugt auch Absätze (<p>); das macht nl2br() nicht.

  3. Andreas am 16.07.2010 10:09:

    Damit ich meinen RSS-Feed gut abgreifen kann (ähnlich deiner Kommentaranzeige auf der Startseite) verwende ich, was die Länge angeht, eine ähnliche, aber einfacher aufgebaute Funktion. Wo ich die herhabe, weiß ich nicht mehr, erfunden habe ich sie jedenfalls nicht. Sie erfüllt ihren Zweck. Bei 180 Zeichen Obergrenze wird am letzten vorher gehenden Leerzeichen gekappt. Damit habe ich auch die "end on word" Funktion abgedeckt. (Verwende kein WP)

    $ausgabe = utf8_decode($item['description']);
    
    if ( strlen($ausgabe) > 180 ) {
        $ausgabe = substr($ausgabe, 0, strpos($ausgabe, ' ', 180));
    }
    

    Danke auch für deine "Escape"-Funktion, die ich hier zur Ausgabe des Codes verwendet habe.

  4. Thomas Scholz am 16.07.2010 18:32:

    @Andreas: utf8_decode() wandelt Zeichen, die nicht in ISO-8859-1 vorkommen, in Fragezeichen um. Sehr gefährlich!
    Benutze lieber mb_strlen($item['description'], 'utf-8'), und verzichte auf die Konvertierung.

Was sagst du dazu?

RSS-Feed für diese Kommentare · Hinweise zum Datenschutz
Nur das ist Pflicht, der Rest … nicht.
Bitte maskiere < und > mit und , sonst werden sie gefressen.