Wie kann man den Auszug mit einem Satz anstatt mit einem Wort beenden?


15

Hier ist der Auszug aus dem Beitrag auf meiner Homepage. Ich möchte den Auszug mit einem Satz beenden. In diesem Fall sind es Chancen. '. Ich kann die Länge ändern, aber es tut nicht, was ich will.

Bildbeschreibung hier eingeben

Hier ist ein Auszug aus einer anderen Website. Hier sehen Sie einen Auszug, der mit einem richtigen Satz endet, der nicht mit dem ersten Wort des nächsten Satzes "Proaktiv" endet.

Bildbeschreibung hier eingeben

Nach der Implementierung der Lösung durch GM :

Bildbeschreibung hier eingeben


Bitte erläutern Sie Ihr Problem besser. Anhand der Antworten und Kommentare ist es schwer zu verstehen, was Sie erreichen möchten.
Kaiser

@kaiser Ich habe die Angaben aktualisiert.
Mohit

@Mohit hast du meinen Code ausprobiert?
gmazzap

Ja, der Auszug endet mit einem Satz, aber "Read More" ist weg.
Mohit

@GM Alles klar, ich muss den read more in der return hinzufügen.
Mohit

Antworten:


13

Dies erfordert PHP 5.3+ (WP erfordert PHP 5.2.4+)

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

Bearbeiten

Nach @kaiser Kommentar versuche ich, dies beim Speichern / Aktualisieren auszuführen, um zu verhindern, dass die Seite langsamer wird, wenn viele Beiträge angezeigt werden. Dies sollte getestet werden

add_filter('wp_insert_post_data', 'end_with_sentence_on_save', 20, 2);

function end_with_sentence_on_save($data, $postarr) {
  if ( ! empty( $data['post_content'] ) && $data['post_status'] != 'inherit' && $data['post_status'] != 'trash' ) {
    $text = strip_shortcodes( $data['post_content'] );
    $text = apply_filters('the_content', $text );
    $text = str_replace(']]>', ']]>', $text );
    $excerpt_length = apply_filters('excerpt_length', 55);
    $data['post_excerpt'] = wp_trim_words($text, $excerpt_length, '');
  } else {
    return $data;
  }
  $allowed_end = array('.', '!', '?', '...');
  $exc = explode(' ', $data['post_excerpt']);
  $found = false;
  $last = '';
  while ( ! $found && ! empty($exc) ) { 
    $last = array_pop($exc);
    $end = strrev( $last );
    $found = in_array( $end{0}, $allowed_end );
  }
  if (! empty($exc)) $data['post_excerpt'] = rtrim(implode(' ', $exc) . ' ' .$last);
  return $data; 
}

1
sicher darüber $end{0}:? Übrigens könnten Sie einfach zurückkehren oder breakwenn etwas gefunden wird. Zusätzlicher Hinweis: Möglicherweise ist dies besser, wenn Sie den Beitrag speichern, sodass er zur Laufzeit nicht neu generiert wird. Dies kann recht langsam werden, wenn Sie viele Beiträge anzeigen.
Kaiser

@kaiser cite: Auf Strings kann zum selben Zweck auch mit geschweiften Klammern wie in $ str {42} zugegriffen werden. php.net docs Um etwas zu finden, musste ich das letzte Zeichen des letzten Strings finden. Mit unterbreche $foundich den Zyklus und überprüfe die letzte Zeichenfolge, so dass keine Notwendigkeit besteht break.
gmazzap

Völlig verpasst, dass es sich um eine whileÜberprüfung handelt false. +1
Kaiser

@kaiser +1 für den zweiten Teil Ihres Kommentars, jetzt bearbeite ich den Code, um ihn auf save
gmazzap auszuführen

1
Sicher, @jessica war eine schlechte Bearbeitung (in der Originalversion war es in Ordnung). Danke, behoben.
gmazzap

2

Hier ist meine Version, die alle HTML-Tags enthält und den Inhalt nach dem letzten Wort in einem Satz abschneidet

if ( ! function_exists( 'pietergoosen_custom_wp_trim_excerpt' ) ) : 

    function pietergoosen_custom_wp_trim_excerpt($pietergoosen_excerpt) {
    global $post;
    $raw_excerpt = $pietergoosen_excerpt;
        if ( '' == $pietergoosen_excerpt ) {

            $pietergoosen_excerpt = get_the_content('');
            $pietergoosen_excerpt = strip_shortcodes( $pietergoosen_excerpt );
            $pietergoosen_excerpt = apply_filters('the_content', $pietergoosen_excerpt);
            $pietergoosen_excerpt = str_replace(']]>', ']]>', $pietergoosen_excerpt);

            //Set the excerpt word count and only break after sentence is complete.
                $excerpt_word_count = 75;
                $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
                $tokens = array();
                $excerptOutput = '';
                $count = 0;

                // Divide the string into tokens; HTML tags, or words, followed by any whitespace
                preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $pietergoosen_excerpt, $tokens);

                foreach ($tokens[0] as $token) { 

                    if ($count >= $excerpt_word_count && preg_match('/[\?\.\!]\s*$/uS', $token)) { 
                    // Limit reached, continue until  ? . or ! occur at the end
                        $excerptOutput .= trim($token);
                        break;
                    }

                    // Add words to complete sentence
                    $count++;

                    // Append what's left of the token
                    $excerptOutput .= $token;
                }

            $pietergoosen_excerpt = trim(force_balance_tags($excerptOutput));

                $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
                $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

                //$pos = strrpos($pietergoosen_excerpt, '</');
                //if ($pos !== false)
                // Inside last HTML tag
                //$pietergoosen_excerpt = substr_replace($pietergoosen_excerpt, $excerpt_end, $pos, 0);
                //else
                // After the content
                $pietergoosen_excerpt .= $excerpt_end;

            return $pietergoosen_excerpt;   

        }
        return apply_filters('pietergoosen_custom_wp_trim_excerpt', $pietergoosen_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'pietergoosen_custom_wp_trim_excerpt'); 

0

Nur für den Fall, dass jemand die Antwort verwendet, ein Hinweis: Dies wird die erweiterten benutzerdefinierten Felder ruinieren. ACF wird auch aufgerufen, wp_insert_post_datawenn ein Feld erstellt oder aktualisiert wird, die $dataVariable ist jedoch nicht dieselbe. Dies führt dazu, dass der Name des ACF-Felds zu einem unlesbaren Fehler wird, der dazu führt, dass das Feld nicht verwendet werden kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.