apply_filters () e the_excerpt stanno dando risultati imprevisti


10

Sento che qui mi manca qualcosa di abbastanza ovvio, ma non riesco a convincere WordPress a collaborare.

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

Dalla deprecazione di get_the_excerpt($post->ID), c'è un altro modo per creare un estratto senza dover creare un ciclo completamente nuovo? Mi sembra eccessivo.

Il mio primo istinto era di usare apply_filters():

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

Questo mi dà il post completo, completo di contenuti in formato HTML. Va bene, deve essere sbagliato. Quindi ho provato la prossima idea logica:

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

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

Va bene nessun problema. Saltiamo tutte le cose fantasiose e basta andare per la voce tagliata:

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

Nessun cambiamento.

Quindi, la mia domanda è questa: che diamine sta succedendo? C'è qualcosa che mi manca, qui?

Sono entrato nel core del WP per scoprire come the_excerpt()funziona e sembra essere identico alla mia chiamata:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Ho alcune domande basate sui miei risultati:

  1. Perché il filtro non si applica come previsto?
  2. C'è un modo per estrarre l'estratto dal loop senza creare un nuovo loop?
  3. Sono pazzo?

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


get_the_excerpt()non è obsoleto, non viene più utilizzato solo il parametro aggiuntivo che era stato passato ad esso.
Milo,

Scusa, questo è ciò che intendevo. Grazie per il chiarimento.
jlengstorf,

Sei pazzo! . . . come sono io lol
pythonian29033

Risposte:


16

Si scopre che la risposta era wp_trim_excerpt().

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

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
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, ho aggiunto un filtro rapido al mio tema che risolve il problema:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
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');

È in qualche modo ridondante, ma mi piace di più che aprire nuovi loop ogni volta che voglio generare un estratto.


1
Ah, non mi è stato chiaro che stai cercando solo l'operazione di testo (non recuperabile da DB).
Hakre,

Nessun problema. Temo sempre di non avere senso quando faccio domande. Io stavo tirando dal database, ma non volevo aprire un intero 'nother ciclo dal momento che ho cose come get_the_title($post->ID)disponibili. L'ultima riga di codice era$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf,

Mi sento davvero stupido chiederlo, ma come si chiama questo nuovo filtro? L'ho provato come $content = apply_filters( 'rw_trim_excerpt', $content );e $content = rw_trim_excerpt($content);, ma nessuno di questi ha funzionato (il primo non ha tagliato l'output e il successivo ha prodotto un errore).
Eric K,

2
@QuantumDynamix Questo è stato progettato per modificare la get_the_excerptgestione di imitare the_excerpt, in modo da poter chiamare: apply_filters('get_the_excerpt', $content);.
jlengstorf,

uff! bello dal punto di vista di un wob noob, grazie
pythonian29033

1

Provare:

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

Vedi: get_postCodice per tutti i membri di ritorno disponibili.


4
Ciò ritorna vuoto se non è stato inserito alcun estratto per il post. Ho bisogno di imitare le azioni di get_the_excerpt () (creando un estratto se non esiste).
jlengstorf,

L'applicazione del filtro non lo farà, quindi stai facendo la domanda sbagliata. Non ho idea del perché stai cercando un estratto se non ce n'è. get_the_excerpt()non imita quello, controlla la fonte, sta solo accedendo alla variabile membro di $postcui è post_excerpt. Vedi anche il link al codice nella risposta.
Hacre,

3
Dalla voce del Codex in poi the_excerpt: "mostrerà un estratto automatico che si riferisce alle prime 55 parole del contenuto del post." Sto cercando di imitare quel comportamento al di fuori del ciclo.
jlengstorf,

Bene, crea temporaneamente un secondo ciclo e interroga quel file con il suo id, quindi probabilmente per una soluzione rapida. Vedi loop secondari - codex.wordpress.org/Function_Reference/…
hakre

1
Grazie per il link Sapevo di poter creare un loop aggiuntivo, ma sembra eccessivo. La mia soluzione era l'aggiunta di un filtro. Lo vedo come un po 'di grasso al gomito ora per molto meno codice dopo.
jlengstorf,

0

Puoi usare la mia funzione personalizzata per filtrare il contenuto ( proviene da NARGA Framework )

  • Se il post ha un estratto personalizzato, visualizzalo invece il contenuto
  • Generare automaticamente estratto dal contenuto se il post non ha un certificato personalizzato
  • Shortcode di ritaglio automatico, codice HTML, [...] rimuovi, aggiungi testo "Altre informazioni" (traducibile)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        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);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        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') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.