Cum să incluzi line-breaks în the_excerpt?
Cum pot să includ un line-break în the_excerpt? Am modificat lungimea și butonul "citește mai mult" prin intermediul functions.php. Folosesc teaser pentru fiecare intrare de blog și uneori arată destul de urât faptul că nu există line-breaks incluse.

Similar cu soluția lui Johannes Pille, soluția de mai jos ar trebui să fie mai adaptabilă.
În detaliu:
- rescrie funcția wp_trim_excerpt
- elimină vechiul filtru și adaugă un nou filtru personalizat
Iată codul complet:
// adaugă în 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);
// trece prin filtrul original
$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);
}
// elimină filtrul implicit
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
// adaugă filtrul personalizat
add_filter('get_the_excerpt', 'so306588_trim_excerpt_custom');

Îmi place. +1. Dacă OP ar fi acceptat-o vreodată pe a mea, aș fi comentat "Acesta ar trebui să fie răspunsul acceptat (acum)."

A funcționat perfect, până când a încetat să mai funcționeze acum câteva zile... Dar nu am reușit încă să identific exact eroarea. Dar din moment ce @Nitzki a comentat similar la soluția lui Johannes, presupun că WordPress a făcut ceva într-o actualizare recentă care a stricat funcționalitatea...

Nu există niciun filtru care să vă permită să setați etichetele permise pentru a nu fi eliminate de către the_excerpt()
. Se poate considera o deficiență a nucleului.
Oricum, generarea reală a rezumatului nu are loc în acea etichetă de șablon, ci în altă parte:
Rezumatele sunt generate de funcția wp_trim_excerpt()
, în interiorul căreia se aplică filtrele de rezumat pe care le utilizați deja (excerpt_length
și excerpt_more
) și care apelează wp_trim_words()
, care la rândul său apelează wp_strip_all_tags()
. Toate cele trei funcții se află în wp-includes/formatting.php
Prin urmare, în lipsa unui filtru pentru acest caz și inevitabilitatea ca rezumatul dumneavoastră să treacă prin wp_strip_all_tags()
, singura posibilitate de a păstra unele etichete este adăugarea unei funcții personalizate de înlocuire pentru 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' );

În acest moment, este posibil să folosiți funcția the_excerpt()
pentru a afișa rezumatul cu întreruperi de linie. Dar dacă doriți să returnați rezultatul, puteți utiliza pentru acest scop o funcție precum aceasta:
function get_the_excerpt_theme() {
$excerpt = get_the_excerpt();
$excerpt = apply_filters( 'the_excerpt', $excerpt );
return $excerpt;
}
Aceasta aplică filtre pentru rezumat folosind apply_filters('the_excerpt', $excerpt )
la fel ca în funcția WordPress the_excerpt()
, dar returnează șirul de caractere fără a-l afișa.
De asemenea, dacă doriți să permiteți doar întreruperi de linie în rezumat, puteți adăuga $excerpt = strip_tags($excerpt,'<br>')
sub linia apply_filters
.
Sper că vă ajută!

O soluție simplă este înlocuirea întreruperilor de linie înainte ca WordPress să le înlocuiască. Am folosit un caracter ales arbitrar din zona privată Unicode, deoarece nu este de așteptat să apară în orice conținut, iar dacă apare, acesta este destinat utilizării private pentru a indica faptul că manipularea nu este standardizată.
add_filter('wp_trim_words', function($text, $num_words, $more, $original_text) {
static $filtering;
if ( $filtering ) {
return $text;
}
$filtering = true;
// Caracter aleatoriu dintr-o zonă privată 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); // sau str_replace($private_use_char, "<br>", $text)
$filtering = false;
return $text;
}, 10, 4);
Rețineți că acest lucru va duce la apariția caracterelor "\n"
în rezultatul funcțiilor the_excerpt()
și get_the_excerpt()
, așa că probabil veți dori să aplicați wpautop()
înainte de a le utiliza în HTML. Alternativ, puteți înlocui direct $private_use_char
cu <br>
în loc de \n
, așa cum este indicat în comentariu.

Se pare că cea mai recentă versiune de WordPress tratează câmpul de rezumat ca un câmp normal de conținut al postării.. Tocmai am încercat pe SandboxWordpress.com și noile linii acum sunt returnate ca etichete de paragraf separate. Cu toate acestea, sunt sigur că acest lucru a funcționat în trecut, altfel nu l-aș fi împărtășit. Nu sunt sigur că era necesar un vot negativ, dar mă bucur că acest lucru a fost adus în atenția mea.

Ei bine, pot elimina votul negativ, nu sunt sigur care este modalitatea corectă, deoarece în ciuda faptului că cred că acest lucru ar fi putut funcționa în trecut, l-am încercat și acum nu mai funcționează, așa că am simțit că mi-am irosit timpul, dar pe de altă parte, cu siguranță niciun răspuns nu poate rămâne valabil pentru totdeauna când sistemul pentru care este destinat se schimbă. Deci, care ar fi modalitatea corectă de a indica faptul că răspunsul nu mai este util, chiar dacă ar fi putut fi în trecut? Sunt deschis la sugestii. Te rog adaugă o notă în răspuns indicând că nu mai funcționează cu cea mai recentă versiune de WP, și voi elimina votul negativ. Înțelegere?
