Utilizzo di wp_trim_excerpt per ottenere the_excerpt () fuori dal ciclo


20

Sto costruendo un tema che mostrerà degli estratti sulla homepage per potenzialmente dozzine di post. Non ho estratti manuali su tutti i miei post, quindi $post->post_excerptè vuoto per molti post. Nel caso in cui non sia presente un estratto manuale, vorrei utilizzare la funzione get_the_excerpt () incorporata, ma non è disponibile al di fuori del ciclo.

Rintracciando la funzione, sembra che usi wp_trim_excerpt da wp-Includes / formatting.php per creare estratti al volo. Lo sto chiamando nel mio codice come wp_trim_excerpt( $item->post_content ), ma sta semplicemente restituendo l'intero contenuto. Sto facendo qualcosa di sbagliato?

So che posso creare la mia funzione per creare un estratto, ma mi piace usare le funzioni integrate ove possibile, mantenendo il mio codice compatibile con altri potenziali plugin / filtri.

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php


Potresti provare a chiamare i filtri di estratto ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os,

Risposte:



8

wp_trim_excerpt() ha una meccanica un po 'curiosa - se qualcosa gli viene passato, allora non fa nulla.

Ecco la logica di base dietro:

  • get_the_excerpt() verifica l'estratto manuale;
  • wp_trim_excerpt() interviene se non è presente un estratto manuale e ne ricava uno dal contenuto o dal teaser.

Entrambi sono strettamente legati alle variabili globali e quindi Loop.

Al di fuori del Loop è meglio estrarre il codice wp_trim_excerpt()e scrivere la propria funzione di taglio.


6

Aggiornare:

Ecco una derivata di wp_trim_excerpt () che ho usato. Funziona perfettamente. Derivato da Wordpress versione 3.0.4

function my_excerpt($text, $excerpt)
{
    if ($excerpt) return $excerpt;

    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $text = strip_tags($text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
    } else {
            $text = implode(' ', $words);
    }

    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Non è necessario pubblicare una nuova risposta, è sempre possibile modificare quella precedente per includere nuove informazioni. Ad esempio, è possibile copiare il collegamento al codice WP dalla prima risposta in questa e quindi eliminare la prima risposta.
Jan Fabry,

Per copia / pasters là fuori: aggiungi $ raw_excerpt = $ text;
Svetoslav Marinov,

1

Ecco la mia opinione su un "trim_excerpt" che prende l'oggetto post o un ID post come parametro.

Ovviamente basato su ciò che è nel nucleo. Non so perché questo (e get_the_author ()) non hanno equivalenti senza loop.

/**
     * Generates an excerpt from the content, if needed.
     *
     * @param int|object $post_or_id can be the post ID, or the actual $post object itself
     * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
     * @return string the snipped excerpt or the manual excerpt if it exists         
     */
    function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
        if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
        else $postObj = get_post($post_or_id);

        $raw_excerpt = $text = $postObj->post_excerpt;
        if ( '' == $text ) {
            $text = $postObj->post_content;

            $text = strip_shortcodes( $text );

            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);

            // don't automatically assume we will be using the global "read more" link provided by the theme
            // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
            $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
            if ( count($words) > $excerpt_length ) {
                array_pop($words);
                $text = implode(' ', $words);
                $text = $text . $excerpt_more;
            } else {
                $text = implode(' ', $words);
            }
        }
        return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }

0

+1 a Rast. È molto strano che non esista get_the_excerpt ($ post-> ID), quando dovrebbe essere abbastanza ovvio che dovrebbe. Ad ogni modo, ecco wp_trim_excerpt () in wordpress versione 3.0.4:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

function wp_trim_excerpt($text) {
1824            $raw_excerpt = $text;
1825            if ( '' == $text ) {
1826                    $text = get_the_content('');
1827    
1828                    $text = strip_shortcodes( $text );
1829    
1830                    $text = apply_filters('the_content', $text);
1831                    $text = str_replace(']]>', ']]>', $text);
1832                    $text = strip_tags($text);
1833                    $excerpt_length = apply_filters('excerpt_length', 55);
1834                    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835                    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836                    if ( count($words) > $excerpt_length ) {
1837                            array_pop($words);
1838                            $text = implode(' ', $words);
1839                            $text = $text . $excerpt_more;
1840                    } else {
1841                            $text = implode(' ', $words);
1842                    }
1843            }
1844            return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845    }

Alla riga 1826 puoi vedere che è collegato alla variabile globale $ post tramite get_the_contents. E sì, non ho idea di cosa stessero pensando. Ma da qui, sostituisci get_the_content con $ text nel tuo my_excerpt, e dovrebbe comportarsi in modo simile.


azure_ardee : considera l'utilizzo di wp_trim_words ()

0

La funzione get_the_content () restituirebbe il contenuto completo se $ more! = 0. È necessario impostare la variabile globale $ more su 0 per assicurarsi che la funzione get_the_content () restituisca un estratto.

Funzione wp_trim_excerpt () modificata:

function wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        global $more;
        $tmp = $more;
        $more = 0;
        $text = get_the_content('');
        $more = $tmp;

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

0

Utilizzando le risposte degli altri sopra, ecco una risposta più semplice che sembra funzionare bene:

global $post;

$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));

if ( $excerpt == '' ) {
    $excerpt = wp_trim_words( $post->post_content, 55 );
}

Lo sto usando nei <meta>tag in una funzione per definire le descrizioni di OpenGraph. Quindi aggiungo solo:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />

Che dire del contenuto HTML? Come verranno gestiti i tag? l'estratto inoltre rimuove tag html e shortcode. cosa succede se le prime parole dell'estratto contengono un'immagine? Ciò probabilmente interromperà il layout.
Brett
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.