Come terminare l'estratto con una frase piuttosto che una parola?


15

Ecco l'estratto del post sulla mia home page. Voglio concludere l'estratto con una frase. In questo caso è 'opportunità. '. So come modificare la lunghezza ma non farà quello che voglio.

inserisci qui la descrizione dell'immagine

Ecco un estratto da un altro sito Web. Qui vedi un estratto che termina con una frase corretta a differenza di quanto sopra che termina con la prima parola della frase successiva 'Proattivamente'.

inserisci qui la descrizione dell'immagine

Dopo aver implementato la soluzione da GM : -

inserisci qui la descrizione dell'immagine


Spiega il problema meglio di così. Dalle risposte e dai commenti su di essi, è difficile capire cosa vuoi ottenere.
Kaiser

@kaiser Ho aggiornato i dettagli.
Mohit,

@Mohit hai provato il mio codice?
gmazzap

Sì, l'estratto termina con la frase ma "Leggi altro" è sparito.
Mohit,

@GM Va bene, devo aggiungere ulteriori informazioni nel ritorno.
Mohit,

Risposte:


13

Ciò richiede PHP 5.3+ (WP richiede 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);
}

modificare

Dopo il commento di @kaiser, provo a eseguirlo su save / update per evitare che la pagina rallenti la visualizzazione di molti post. Questo dovrebbe essere testato

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
certo a riguardo $end{0}:? A proposito, potresti semplicemente tornare o breakquando viene trovato qualcosa. Nota aggiuntiva: potrebbe essere meglio quando si salva il post, quindi non viene rigenerato durante il runtime, il che può rallentare se si visualizzano molti post.
Kaiser

@kaiser cite: è anche possibile accedere alle stringhe usando le parentesi graffe, come in $ str {42}, per lo stesso scopo. php.net docs Per trovare qualcosa ho dovuto trovare l'ultimo carattere dell'ultima stringa. Usando $foundinterrompo il ciclo e controllo l'ultima stringa, quindi non è necessario break.
gmazzap

Completamente perso che è un whilecontrollo per false. +1
kaiser

@kaiser +1 per la seconda parte del tuo commento, ora modifico il codice per eseguire il salvataggio
gmazzap

1
Sicuramente @jessica è stata una brutta modifica (nella versione originale era ok). Grazie, risolto.
gmazzap

2

Ecco la mia versione, mantenendo tutti i tag html e tagliando anche il contenuto dopo l'ultima parola di una frase

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

Nel caso in cui qualcuno stia usando la risposta, consiglio: questo rovinerà i campi personalizzati avanzati. ACF invoca anche wp_insert_post_dataquando si crea o si aggiorna un campo, ma la $datavariabile non è la stessa e il nome del campo ACF si trasformerà in qualcosa di incomprensibile illeggibile, con il risultato di non poter utilizzare il campo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.