Usando wp_trim_excerpt para obter the_excerpt () fora do loop

20

Estou criando um tema que mostrará trechos na página inicial para potencialmente dezenas de postagens. Não tenho trechos manuais em todas as minhas postagens, por isso $post->post_excerptestá 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 ele usa o wp_trim_excerpt do wp-includes / formatting.php para criar trechos em tempo real. Estou chamando isso no meu código como wp_trim_excerpt( $item->post_content ), mas está simplesmente retornando o conteúdo completo. Estou fazendo algo errado?

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.

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

Derek Perkins
fonte
Você poderia tentar chamar os filtros trecho ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os

Respostas:

8

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

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

  • get_the_excerpt() verifica trecho manual;
  • wp_trim_excerpt() grita se não houver um trecho manual e cria um com conteúdo ou provocação.

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

Fora do loop, é melhor remover o código wp_trim_excerpt()e escrever sua própria função de apara.

Rarst
fonte
6

Atualizar:

Aqui está um derivado 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);
}
Ardee Aram
fonte
Você não precisa postar uma nova resposta, sempre pode editar a antiga para incluir novas informações. Você pode, por exemplo, copiar o link para o código WP da sua primeira resposta para esta e depois excluir sua primeira resposta.
Jan Fabry
Para copy / pasters por aí: adicione $ raw_excerpt = $ text;
Svetoslav Marinov
1

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

Obviamente, com base no que é essencial. Não sei por que isso (e get_the_author ()) não tem equivalentes sem 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);
    }
Tom Auger
fonte
0

+1 a Rast. É muito estranho que não exista get_the_excerpt ($ post-> ID), quando deveria ser bastante óbvio que deveria. Enfim, aqui está o wp_trim_excerpt () no wordpress versão 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    }

Você pode ver na linha 1826 que está vinculada à variável global $ post via get_the_contents. E sim, 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.

Ardee Aram
fonte
azure_ardee : considere usar wp_trim_words ()
0

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

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

fonte
0

Usando as respostas de outras pessoas acima, aqui está 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-o nas <meta>tags de uma função para definir as descrições do OpenGraph. Então, eu apenas adiciono:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
dpruth
fonte
E o conteúdo HTML? Como isso vai lidar com as tags? o trecho também retira tags e códigos de acesso html. e se as primeiras palavras do trecho contiverem uma imagem? Isso provavelmente quebrará seu layout.
brett