Cum să incluzi line-breaks în the_excerpt?

8 oct. 2012, 17:01:34
Vizualizări: 21.3K
Voturi: 10

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.

0
Toate răspunsurile la întrebare 6
2

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');
21 iun. 2018 10:02:11
Comentarii

Î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)."

Johannes Pille Johannes Pille
2 iul. 2018 20:50:57

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...

user3696412 user3696412
29 oct. 2020 18:10:23
2

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' );
8 oct. 2012 18:07:02
Comentarii

Bine, mulțumesc. Dar acum se pare că nu mai pot scurta rezumatul la 20 de cuvinte și să pun un buton "more" în loc de [...].

Nitzki Nitzki
8 oct. 2012 19:03:25

Deci cum pot edita acum excerpt_length și excerpt_more? Nu mai funcționează.

Nitzki Nitzki
9 oct. 2012 13:45:20
2

nu ar fi mai simplu să aplici filtrul the_content la excerpt?

eu folosesc asta doar ocazional, direct în fișierul template:

$excerpt = apply_filters('the_content',  ( get_post(get_the_ID())->post_excerpt) );
echo $excerpt;
9 apr. 2020 20:50:35
Comentarii

Genial! A funcționat pentru mine

A. D'Alfonso A. D'Alfonso
30 mar. 2021 12:57:31

Asta pare exact ce am nevoie. Dar unde în template ar trebui pus acest cod, @diette? Mulțumesc!

DWright DWright
21 ian. 2023 19:33:23
1

Î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ă!

22 sept. 2016 14:30:13
Comentarii

Aceasta nu funcționează deoarece nu permite întreruperi de linie.

Jason Axelson Jason Axelson
3 mar. 2022 11:14:41
0

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.

27 mar. 2024 13:35:20
3
-1

de asemenea, poți folosi funcția PHP nl2br():

echo nl2br(get_the_excerpt());

-- sau --

nl2br(the_excerpt());
16 oct. 2017 11:13:31
Comentarii

Aceasta nu funcționează.

Bence Szalai Bence Szalai
15 dec. 2020 22:16:05

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.

mroncetwice mroncetwice
18 dec. 2020 04:57:06

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?

Bence Szalai Bence Szalai
18 dec. 2020 13:56:15