Come includere interruzioni di riga in the_excerpt?

8 ott 2012, 17:01:34
Visualizzazioni: 21.3K
Voti: 10

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.

0
Tutte le risposte alla domanda 6
2

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');
21 giu 2018 10:02:11
Commenti

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

Johannes Pille Johannes Pille
2 lug 2018 20:50:57

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

user3696412 user3696412
29 ott 2020 18:10:23
2

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' );
8 ott 2012 18:07:02
Commenti

Va bene, grazie. Ma ora sembra che non riesca più ad abbreviare l'estratto a 20 parole e inserire un pulsante "altro" invece di [...]

Nitzki Nitzki
8 ott 2012 19:03:25

Quindi come posso modificare ora excerpt_length e excerpt_more? Non funziona più.

Nitzki Nitzki
9 ott 2012 13:45:20
2

non sarebbe più semplice applicare il filtro the_content all'excerpt?

uso questo metodo occasionalmente, direttamente nel file del template:

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

Fantastico! Ha funzionato per me

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

Sembra proprio quello che mi serve. Ma dove nel template bisogna inserirlo, @diette? Grazie!

DWright DWright
21 gen 2023 19:33:23
1

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!

22 set 2016 14:30:13
Commenti

Questo non funziona perché non consente gli interruzioni di riga.

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

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.

27 mar 2024 13:35:20
3
-1

potresti anche usare la funzione nl2br() di PHP:

echo nl2br(get_the_excerpt());

-- oppure --

nl2br(the_excerpt());
16 ott 2017 11:13:31
Commenti

Questo non funziona.

Bence Szalai Bence Szalai
15 dic 2020 22:16:05

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.

mroncetwice mroncetwice
18 dic 2020 04:57:06

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?

Bence Szalai Bence Szalai
18 dic 2020 13:56:15