Usando o wp_trim_excerpt para obter o the_excerpt () fora do loop

19

Estou criando um tema que mostrará trechos da página inicial para potencialmente dezenas de postagens. Não tenho trechos manuais em todas as minhas postagens, então $post->post_excerpt está vazio para muitas postagens. No caso de não haver um trecho manual, eu gostaria de usar a função interna get_the_excerpt (), mas ela não está disponível fora do loop.

Rastreando a função, parece que ela usa wp_trim_excerpt de wp-includes / formatting.php para criar trechos em tempo real. Eu estou chamando isso no meu código como wp_trim_excerpt( $item->post_content ) , mas ele está simplesmente retornando o conteúdo completo. Estou fazendo algo errado?

Eu sei que posso criar minha própria função para criar um trecho, mas gosto de usar funções internas sempre que possível, mantendo meu código compatível com outros possíveis plugins / filtros.

enlace

    
por Derek Perkins 14.01.2011 / 11:34

7 respostas

21

Desde o WP 3.3.0, wp_trim_words() é útil se você conseguir obter o conteúdo para o qual deseja gerar um trecho. Espero que isso seja útil para alguém e economize criando sua própria função de contagem de palavras.

enlace

    
por jamesc 22.03.2012 / 22:28
8

wp_trim_excerpt() tem um pouco de mecânica curiosa - se alguma coisa é passada para ele, então não faz nada.

Aqui está a lógica básica por trás disso:

  • get_the_excerpt() verifica o excerto manual;
  • wp_trim_excerpt() chimes in se não houver trecho manual e fizer um a partir do conteúdo ou do teaser.

Ambos estão strongmente ligados a variáveis globais e, portanto, a Loop.

Fora do Loop, é melhor tirar o código de wp_trim_excerpt() e escrever sua própria função de recorte.

    
por Rarst 14.01.2011 / 13:01
6

Atualização:

Aqui está uma derivada de wp_trim_excerpt () que eu usei. Funciona perfeitamente. Derivado do Wordpress versão 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);
}
    
por Ardee Aram 21.01.2011 / 04:09
1

Aqui está minha opinião sobre um "trim_excerpt" que leva o objeto post ou um ID de postagem como um parâmetro.

Obviamente, com base no que está no núcleo. Não sei porque isso (e get_the_author ()) não tem equivalentes não-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);
    }
    
por Tom Auger 26.08.2011 / 19:23
0

+1 para Rast. É muito estranho que não exista algo como get_the_excerpt ($ post- > ID), quando deveria ser bastante óbvio que deveria. De qualquer forma, aqui está o wp_trim_excerpt () no wordpress versão 3.0.4:

enlace

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    }

Você pode ver na linha 1826 que ele está vinculado à variável global $ post via get_the_contents. E sim, eu não tenho ideia do que eles estavam pensando. Mas a partir daqui, substitua o get_the_content por $ text no seu próprio my_excerpt, e ele deve se comportar de maneira semelhante.

    
por Ardee Aram 21.01.2011 / 04:01
0

A função get_the_content () retornaria conteúdo completo se $ more! = 0. Você precisa definir a variável global $ more como 0 para garantir que a função get_the_content () retorne o extrato.

Função wp_trim_excerpt () modificada:

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);
}
    
por user4742 17.04.2011 / 19:36
0

Usando as respostas dos outros acima, veja uma resposta mais simples que parece funcionar bem:

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 );
}

Estou usando isso nas tags <meta> em uma função para definir as descrições do OpenGraph. Então eu so adiciono:

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

Tags