Come includere interruzioni di riga in the_excerpt?
Come posso includere un'interruzione di riga all'interno di the_excerpt? Ho modificato la lunghezza e il pulsante "continua" tramite il mio functions.php. Sto usando teaser per ogni articolo del blog e a volte appare poco elegante che non ci siano interruzioni di riga incluse.

Simile alla soluzione di Johannes Pille, la soluzione seguente dovrebbe essere più adattabile.
In dettaglio:
- sovrascrivere la funzione wp_trim_excerpt
- rimuovere il vecchio filtro e aggiungere un nuovo filtro personalizzato
Ecco il codice completo:
// aggiungere al file themes/{your_theme}/functions.php
define('EXCERPT_RARELY', '{[}]');
define('EXCERPT_BR', nl2br(PHP_EOL));
function so306588_trim_excerpt_custom($text = '')
{
add_filter('the_content', 'so306588_trim_excerpt_custom_mark', 6);
// passare attraverso il filtro originale
$text = wp_trim_excerpt($text);
remove_filter('the_content', 'so306588_trim_excerpt_custom_mark', 6);
return so306588_trim_excerpt_custom_restore($text);
}
function so306588_trim_excerpt_custom_mark($text)
{
$text = nl2br($text);
return str_replace(EXCERPT_BR, EXCERPT_RARELY, $text);
}
function so306588_trim_excerpt_custom_restore($text)
{
return str_replace(EXCERPT_RARELY, EXCERPT_BR, $text);
}
// rimuovere il filtro predefinito
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
// aggiungere il filtro personalizzato
add_filter('get_the_excerpt', 'so306588_trim_excerpt_custom');

Mi piace. +1. Se l'OP avesse mai accettato la mia risposta, avrei commentato "Questa dovrebbe essere la risposta accettata (ora)."

Ha funzionato perfettamente, fino a quando ha smesso di funzionare qualche giorno fa... Ma non sono ancora riuscito a identificare l'errore. Dato che @Nitzki ha commentato in modo simile sulla soluzione di Johannes, immagino che WordPress abbia fatto qualcosa in un recente aggiornamento che l'ha bloccata...

Non esiste un filtro che permetta di impostare i tag consentiti per evitare che vengano rimossi da the_excerpt()
. Si tratta senza dubbio di una mancanza del core.
In ogni caso, la generazione effettiva dell'estratto non avviene in quel template tag ma altrove:
Gli estratti sono generati dalla funzione wp_trim_excerpt()
, all'interno della quale vengono applicati i filtri dell'estratto che stai già utilizzando (excerpt_length
e excerpt_more
) e che chiama wp_trim_words()
, la quale a sua volta si appoggia a wp_strip_all_tags()
. Tutte e tre le funzioni si trovano in wp-includes/formatting.php
Quindi, in assenza di un filtro per questo caso e con la certezza che il tuo estratto passerà attraverso wp_strip_all_tags()
, l'unica possibilità per preservare alcuni tag è aggiungere una funzione personalizzata che sostituisca wp_trim_excerpt()
:
function wpse67498_wp_trim_excerpt( $text = '' ) {
$raw_excerpt = $text;
if ( '' == $text ) {
$text = get_the_content( '' );
$text = strip_shortcodes( $text );
$text = apply_filters( 'the_content', $text );
$text = str_replace( ']]>', ']]>', $text );
$excerpt_length = apply_filters( 'excerpt_length', 55 );
$excerpt_more = apply_filters( 'excerpt_more', ' ' . '[...]' );
$allowable = '<br>';
$text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
$text = trim( strip_tags( $text, $allowable ) );
if ( 'characters' == _x( 'words', 'word count: words or characters?' )
&& preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) )
{
$text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
preg_match_all( '/./u', $text, $words_array );
$words_array = array_slice( $words_array[0], 0, $num_words + 1 );
$sep = '';
} else {
$words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
$sep = ' ';
}
if ( count( $words_array ) > $excerpt_length ) {
array_pop( $words_array );
$text = implode( $sep, $words_array );
$text = $text . $excerpt_more;
} else {
$text = implode( $sep, $words_array );
}
}
return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
}
remove_filter( 'get_the_excerpt', 'wp_trim_excerpt');
add_filter( 'get_the_excerpt', 'wpse67498_wp_trim_excerpt' );

Al momento, è possibile utilizzare la funzione the_excerpt()
per visualizzare l'estratto con gli a capo. Ma se preferisci restituire il risultato, puoi usare una funzione come questa:
function get_the_excerpt_theme() {
$excerpt = get_the_excerpt();
$excerpt = apply_filters( 'the_excerpt', $excerpt );
return $excerpt;
}
Applica i filtri all'estratto utilizzando apply_filters('the_excerpt', $excerpt )
come nella funzione wp the_excerpt()
ma restituisce la stringa senza visualizzarla.
Inoltre, se vuoi consentire solo gli a capo nell'estratto, puoi aggiungere $excerpt = strip_tags($excerpt,'<br>')
sotto la riga apply_filters
.
Spero sia utile!

Una soluzione semplice consiste nel sostituire le interruzioni di riga prima che WordPress le sostituisca. Ho utilizzato un carattere selezionato arbitrariamente dall'area privata Unicode poiché non è previsto che appaia in alcun contenuto, inoltre se appare è dedicato all'uso privato per indicare che la gestione non è standardizzata.
add_filter('wp_trim_words', function($text, $num_words, $more, $original_text) {
static $filtering;
if ( $filtering ) {
return $text;
}
$filtering = true;
// Carattere casuale da un'area di uso privato Unicode
$private_use_char = "\u{101425}";
$text = str_replace( ["\n\r", "\n", "\r"], $private_use_char, $original_text);
$text = wp_trim_words($text, $num_words, $more);
$text = str_replace($private_use_char, "\n", $text); // oppure str_replace($private_use_char, "<br>", $text)
$filtering = false;
return $text;
}, 10, 4);
Nota che ciò comporterà la presenza di caratteri "\n"
nell'output di the_excerpt()
e get_the_excerpt()
, quindi probabilmente vorrai chiamare wpautop()
su di essi prima di utilizzarli in HTML. In alternativa puoi semplicemente sostituire $private_use_char
con <br>
invece di \n
come indicato dal commento.

Sembra che l'ultima versione di WordPress tratti il campo dell'excerpt come un normale campo di contenuto del post... Ho appena provato su SandboxWordpress.com e ora i nuovi paragrafi vengono restituiti come tag di paragrafo separati. Detto questo, sono sicuro che in passato funzionasse, altrimenti non l'avrei condiviso. Non sono sicuro che fosse necessario un voto negativo, ma sono contento che me lo abbiate segnalato.

Beh, posso rimuovere il voto negativo, non sono sicuro qual sia il modo corretto, perché nonostante creda che in passato potesse funzionare, ho provato e ora non funziona più, quindi ho sentito di aver perso tempo. D'altra parte, nessuna risposta può rimanere valida per sempre quando il sistema cambia. Quindi qual è il modo corretto per indicare che una risposta non è più utile, anche se potrebbe esserlo stata in passato? Sono aperto a suggerimenti. Per favore aggiungi una nota nella risposta indicando che non funziona più con l'ultima versione di WP, e rimuoverò il voto negativo. Affare fatto?
