apply_filters() e the_excerpt stanno dando risultati inaspettati

31 dic 2011, 19:23:58
Visualizzazioni: 29.1K
Voti: 10

Ho la sensazione di star tralasciando qualcosa di ovvio, ma non riesco a far cooperare WordPress come vorrei.

Sto generando i tag OG di Facebook con una funzione. Tutto funziona bene, tranne l'excerpt.

Da quando get_the_excerpt($post->ID) è stato deprecato, c'è un altro modo per creare un excerpt senza dover creare un intero nuovo loop? Mi sembra eccessivo.

Il mio primo istinto è stato quello di usare apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Questo mi restituisce il post completo, con contenuto formattato in HTML. Ok, deve essere sbagliato. Quindi ho provato la successiva idea logica:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

Niente da fare. Ora non c'è HTML, ma è ancora il post completo (che è davvero confuso).

Ok, nessun problema. Saltiamo tutte le cose elaborate e andiamo direttamente all'estratto tagliato:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Nessun cambiamento.

Quindi, la mia domanda è questa: che diavolo sta succedendo? C'è qualcosa che mi sfugge?

Ho esaminato il core di WP per capire come funziona the_excerpt(), e sembra essere identico alla mia chiamata:

/**
 * Mostra l'excerpt del post.
 *
 * @since 0.71
 * @uses apply_filters() Richiama l'hook 'the_excerpt' sull'excerpt del post.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Ho alcune domande basate sulle mie scoperte:

  1. Perché il filtro non viene applicato come previsto?
  2. C'è un modo per ottenere l'excerpt fuori dal loop senza creare un nuovo loop?
  3. Sono pazzo?

Grazie in anticipo per dare un'occhiata. Sono abbastanza confuso qui.

3
Commenti

get_the_excerpt() non è deprecato, è solo il parametro aggiuntivo che veniva passato che non viene più utilizzato.

Milo Milo
31 dic 2011 19:47:17

Scusa, è quello che intendevo. Grazie per la precisazione.

jlengstorf jlengstorf
31 dic 2011 20:55:57

Sei pazzo!... come lo sono io lol

pythonian29033 pythonian29033
7 ott 2016 11:15:11
Tutte le risposte alla domanda 3
5
16

Si è scoperto che la risposta era nella funzione wp_trim_excerpt().

È definita in wp-includes/functions.php:1879:

/**
 * Genera un estratto dal contenuto, se necessario.
 *
 * La quantità di parole dell'estratto sarà di 55 parole e se la quantità è maggiore
 * di questo, verrà aggiunta la stringa ' [...]' all'estratto. Se la stringa
 * è inferiore a 55 parole, il contenuto verrà restituito così com'è.
 *
 * Il limite di 55 parole può essere modificato da plugin/temi utilizzando il filtro excerpt_length
 * La stringa ' [...]' può essere modificata da plugin/temi utilizzando il filtro excerpt_more
 *
 * @since 1.5.0
 *
 * @param string $text Opzionale. L'estratto. Se impostato su vuoto, viene generato un estratto.
 * @return string L'estratto.
 */
function 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', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Quindi qualsiasi testo passato non viene elaborato; funziona solo se viene chiamato con un parametro vuoto.

Per risolvere questo problema, ho aggiunto un filtro rapido al mio tema che risolve il problema:

/**
 * Consente la generazione di estratti al di fuori del loop.
 * 
 * @param string $text  Il testo da tagliare
 * @return string       Il testo tagliato
 */
function rw_trim_excerpt( $text='' )
{
    $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', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

È un po' ridondante, ma lo preferisco rispetto all'apertura di nuovi loop ogni volta che voglio generare un estratto.

1 gen 2012 20:12:04
Commenti

Ah, non mi era chiaro che stavi cercando solo l'operazione sul testo (non il recupero dal DB).

hakre hakre
2 gen 2012 10:08:46

Non preoccuparti. Temo sempre di non essere chiaro quando faccio domande. Stavo recuperando dal database, ma non volevo aprire un altro ciclo visto che ho già a disposizione cose come get_the_title($post->ID). La riga finale del codice era $description = wp_trim_excerpt(get_post($post->ID)->post_content);

jlengstorf jlengstorf
2 gen 2012 21:56:31

Mi sento davvero stupido a chiederlo, ma come si chiama questo nuovo filtro? Ho provato con $content = apply_filters( 'rw_trim_excerpt', $content ); e $content = rw_trim_excerpt($content);, ma nessuno dei due ha funzionato (il primo non tagliava l'output e il secondo produceva un errore).

Eric K Eric K
26 ago 2015 19:33:39

@QuantumDynamix Questo è progettato per modificare la gestione di get_the_excerpt per emulare the_excerpt, quindi puoi chiamare: apply_filters('get_the_excerpt', $content);.

jlengstorf jlengstorf
1 set 2015 20:07:54

uff! bella soluzione dal punto di vista di un principiante di wpress, grazie

pythonian29033 pythonian29033
7 ott 2016 11:45:08
5

Prova:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Vedi: get_post­Codex per tutti i membri disponibili restituiti.

31 dic 2011 20:09:46
Commenti

Questo restituisce vuoto se non è stato inserito alcun riassunto per il post. Devo replicare il comportamento di get_the_excerpt() (creando un riassunto se non esiste).

jlengstorf jlengstorf
31 dic 2011 21:00:08

Applicare il filtro non farà questo, quindi stai facendo la domanda sbagliata. Non so perché stai cercando un riassunto se non ce n'è nessuno. get_the_excerpt() non replica questo comportamento, controlla il codice sorgente, accede solo alla variabile membro di $post che è post_excerpt. Vedi anche il link al codex nella risposta.

hakre hakre
31 dic 2011 21:11:49

Dalla voce del Codex su the_excerpt: "mostrerà un riassunto automatico che si riferisce alle prime 55 parole del contenuto del post."

Sto cercando di replicare questo comportamento al di fuori del loop.

jlengstorf jlengstorf
31 dic 2011 22:14:44

Creeremo temporaneamente un secondo loop e interrogheremo quel file tramite il suo ID per una soluzione rapida. Vedi Loop Secondari - http://codex.wordpress.org/Function_Reference/query_posts#Secondary_Loops

hakre hakre
1 gen 2012 00:07:42

Grazie per il link. Sapevo di poter impostare un loop aggiuntivo, ma mi sembrava eccessivo. La mia soluzione è stata aggiungere un filtro. Lo vedo come un piccolo sforzo iniziale per molto meno codice in seguito.

jlengstorf jlengstorf
1 gen 2012 20:14:50
0

Puoi utilizzare la mia funzione personalizzata per filtrare il contenuto (proviene dal NARGA Framework)

  • Se il post ha un riassunto personalizzato, visualizza quello invece del contenuto
  • Genera automaticamente un riassunto dal contenuto se il post non ha un riassunto personalizzato
  • Elimina automaticamente gli shortcode, il codice HTML, rimuove [...], aggiunge il testo "Leggi tutto" (traducibile)

        /**
        * Genera automaticamente un riassunto dal contenuto se il post non ha un riassunto personalizzato
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  Il numero massimo di parole per il riassunto generato dal contenuto
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # Se è la home page, un archivio o i risultati di ricerca
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # Se è impostato un riassunto nel box Riassunto Opzionale
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # Se non è impostato alcun riassunto
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Leggi tutto &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Assicurati di restituire il contenuto
        return $content;
        }
        // Aggiungi filtro al contenuto
        add_filter('the_content', 'narga_excerpts');
    
15 mag 2013 16:49:28