Ich benutze diese Funktion, um meinen WP-Auszug auf einen Satz zu beschränken, anstatt ihn nur 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 das geht?

4
user2471501 3 Jän. 2016 im 16:32

2 Antworten

Beste Antwort

Ihr Code hat bei mir für 1 Satz nicht funktioniert, aber hey, hier ist 2 Uhr morgens, vielleicht habe ich etwas verpasst. Ich habe das von Grund auf neu 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);
}
2
James Jones 3 Jän. 2016 im 15:26

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

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

Hier verwenden wir 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)));
}

Verwendung

$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"
1
random_user_name 3 Jän. 2016 im 16:08