WP-Auszug auf Satz 2 beschränken

Lesezeit: 3 Minuten

Ich nutze diese Funktion, um meinen WP-Auszug auf einen Satz zu begrenzen, anstatt ihn einfach nach einer Reihe von Wörtern abzuschneiden.

add_filter('get_the_excerpt', 'end_with_sentence');

function end_with_sentence($excerpt) {
  $allowed_end = array('.', '!', '?', '...');
  $exc = explode( ' ', $excerpt );
  $found = false;
  $last="";
  while ( ! $found && ! empty($exc) ) { 
    $last = array_pop($exc);
    $end = strrev( $last );
    $found = in_array( $end{0}, $allowed_end );
  }
  return (! empty($exc)) ? $excerpt : rtrim(implode(' ', $exc) . ' ' .$last);
}

Funktioniert wie ein Zauber, aber ich möchte dies auf zwei Sätze beschränken. Hat jemand eine Idee, wie man das macht?

  • Was passiert, wenn ein Satz etwas wie enthält Mr. oder Mrs. oder Dr., A.M. oder P.M. oder etc.?

    – rnevius

    3. Januar 2016 um 13:48 Uhr


  • Nun, es ist ein niederländischer Blog, also verwenden wir keine Abkürzungen wie Mr. mit einem Punkt. Und überhaupt ist es im Niederländischen eine Regel (na ja, das haben sie mir in der Schule gesagt und ich wende das immer noch auf meine Texte an), um das ganze Wort anstelle der Abkürzungen zu schreiben. Das ist also nicht wirklich ein Problem.

    – Benutzer2471501

    3. Januar 2016 um 14:20 Uhr

Ihr Code hat bei mir 1 Satz lang nicht funktioniert, aber hey, hier ist es 2 Uhr morgens, vielleicht habe ich etwas verpasst. Das habe ich von Grund auf geschrieben:

add_filter('get_the_excerpt', 'end_with_sentence');

function end_with_sentence( $excerpt ) {
  $allowed_ends = array('.', '!', '?', '...');
  $number_sentences = 2;
  $excerpt_chunk = $excerpt;

  for($i = 0; $i < $number_sentences; $i++){
      $lowest_sentence_end[$i] = 100000000000000000;
      foreach( $allowed_ends as $allowed_end)
      {
        $sentence_end = strpos( $excerpt_chunk, $allowed_end);
        if($sentence_end !== false && $sentence_end < $lowest_sentence_end[$i]){
            $lowest_sentence_end[$i] = $sentence_end + strlen( $allowed_end );
        }
        $sentence_end = false;
      }

      $sentences[$i] = substr( $excerpt_chunk, 0, $lowest_sentence_end[$i]);
      $excerpt_chunk = substr( $excerpt_chunk, $lowest_sentence_end[$i]);
  }

  return implode('', $sentences);
}

  • Das funktioniert perfekt! Gibt es auch eine Möglichkeit, am Ende einen Weiterlesen-Tag hinzuzufügen?

    – Benutzer2471501

    3. Januar 2016 um 15:43 Uhr

  • Ich denke schon, du könntest einfach tauschen return implode('', $sentences); mit return implode('', $sentences) . ' ... Read More';. Hängt davon ab, wie fortgeschritten Ihre Implementierung sein soll.

    – James Jones

    3. Januar 2016 um 16:25 Uhr

  • @James Jones Klug!! Kern sein sollte!

    – Chris Pink

    25. Juni 2021 um 7:36 Uhr


Ich sehe Komplexitäten in Ihrem Beispielcode, die es (vielleicht) schwieriger machen, als es sein muss.

Reguläre Ausdrücke sind genial. Wenn Sie dieses ändern möchten, würde ich die Verwendung dieses Tools empfehlen: https://regex101.com/

Hier werden wir verwenden preg_split()

function end_with_sentence( $excerpt, $number = 2 ) {
    $sentences = preg_split( "/(\.|\!|\?|\...)/", $excerpt, NULL, PREG_SPLIT_DELIM_CAPTURE);

    var_dump($sentences);

    if (count($sentences) < $number) {
         return $excerpt;
    }

    return implode('', array_slice($sentences, 0, ($number * 2)));
}

Verwendungszweck

$excerpt="Sentence. Sentence!  Sentence? Sentence";

echo end_with_sentence($excerpt); // "Sentence. Sentence!"
echo end_with_sentence($excerpt, 1); // "Sentence."
echo end_with_sentence($excerpt, 3); // "Sentence. Sentence!  Sentence?"
echo end_with_sentence($excerpt, 4); // "Sentence. Sentence!  Sentence? Sentence"
echo end_with_sentence($excerpt, 10); // "Sentence. Sentence!  Sentence? Sentence"

1257660cookie-checkWP-Auszug auf Satz 2 beschränken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy