toscho.design

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);

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

  5. DeaFischer am 04.03.2011 · 08:45

    Hallochen, ich habe eure Kommentare durch gelesen und gemerkt das ihr sehr tief programmieren können.

    Deswegen kommt hier meine Frage, die nicht so ganz mit der Thema zu tun hat, bisschen schon:

    Meine Firma hat eine Homepage und verschiedene Blogs, dazu eine in WordPress.
    In der Index.php dieses Homepage wir zeigen immer die letzte Posts von WordPress Blog. Leider unserer ganze Homepage benutzt ISO-8859-1 und die WordPress Posts kommen in UTF8, voll "vermasseln". Hat jemand eine Idee wie kann ich nur diese Stück Code in ISO verwandeln? Habe auch mit der utf8_decode() versucht, ergibt keine Änderung.

    Bitte hilfeeeeeeeeeeee!!! ;-)

    Sorry für meine Deutsch und danke

    Andrea

  6. DeaFischer am 04.03.2011 · 11:47

    @DeaFischer:
    Ich habe selber eine Lösung gefunden.

    <?php while (have_posts()): the_post(); ?>
    <?php 
    												$title= the_title('', '', false); 
    												echo utf8_decode($title);?>
    <?php 
    												      $content= get_the_content();
    													  echo utf8_decode($content);
    											          endwhile; 
    												 ?>

    Mann muss zuerst the_title() und get_the_content() auf eine andere variable machen, nur dann eine echo mit decode. ;-)

    MFG