apply_filters () e the_excerpt estão dando resultados inesperados

10

Sinto que devo estar perdendo algo bastante óbvio aqui, mas não consigo fazer o WordPress cooperar.

Estou gerando tags OG do Facebook com uma função. Tudo funciona bem, exceto o trecho.

Desde a depreciação de get_the_excerpt($post->ID), existe outra maneira de criar um trecho sem ter que criar um loop totalmente novo? Parece excessivo para mim.

Meu primeiro instinto foi usar apply_filters():

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

Isso me dá a postagem completa, completa com conteúdo formatado em HTML. Ok, deve estar errado. Então, tentei a próxima idéia lógica:

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

Sem dados. Agora não há HTML, mas ainda é o post completo (o que é realmente confuso).

Ok sem problemas. Vamos pular todas as coisas chiques e apenas ir para a entrada aparada:

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

Nenhuma mudança.

Então, minha pergunta é a seguinte: o que diabos está acontecendo? Está faltando algo aqui?

Entrei no núcleo do WP para descobrir como the_excerpt()funciona e parece idêntico à minha chamada:

/**
 * 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());
}

Tenho algumas perguntas com base em minhas descobertas:

  1. Por que o filtro não está sendo aplicado conforme o esperado?
  2. Existe uma maneira de obter o trecho fora do loop sem criar um novo loop?
  3. Eu sou louco?

Agradecemos antecipadamente por dar uma olhada. Estou bastante perplexo, aqui.

jlengstorf
fonte
get_the_excerpt()não é preterido, apenas os parâmetros extras que costumavam ser passados ​​para ele não são mais usados.
Milo
Desculpe, foi o que eu quis dizer. Obrigado por esclarecer.
Jlengstorf
Você é louco! . . . como sou eu lol
pythonian29033 7/16

Respostas:

16

Acontece que a resposta estava em wp_trim_excerpt().

Está definido em 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);
}

Portanto, qualquer texto passado não é processado; só funciona se for chamado com um parâmetro vazio.

Para resolver isso, adicionei um filtro rápido ao meu tema que resolve o 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');

É um pouco redundante, mas eu gosto mais do que abrir novos loops toda vez que quero gerar um trecho.

jlengstorf
fonte
11
Ah, não ficou claro para mim que você está procurando apenas a operação de texto (não buscando no DB).
hakre
Não se preocupe. Eu sempre temo não fazer sentido quando faço perguntas. Eu estava retirando do banco de dados, mas não queria abrir um loop inteiro, já que tenho coisas como get_the_title($post->ID)disponíveis. A linha final do código era$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf
Eu me sinto muito estúpido em perguntar isso, mas como você chama esse novo filtro? Eu tentei como $content = apply_filters( 'rw_trim_excerpt', $content );e $content = rw_trim_excerpt($content);, mas nenhum deles funcionou (o antigo não cortou a saída e o posterior produziu um erro).
Eric K
2
@QuantumDynamix Isto é projetado para modificar o get_the_excerptmanuseio para imitar the_excerpt, para que você pode ligar no: apply_filters('get_the_excerpt', $content);.
jlengstorf 01/09/2015
ufa! nice one do ponto de uma de noob wpress de vista, graças
pythonian29033
1

Tentar:

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

Consulte: get_postCodex para todos os membros de retorno disponíveis.

hakre
fonte
4
Isso retorna em branco se nenhum trecho foi inserido para a postagem. Eu preciso imitar as ações de get_the_excerpt () (criando um trecho, se não houver).
jlengstorf 31/12/11
A aplicação do filtro não fará isso, então você está fazendo a pergunta errada. Não faço ideia por que você está procurando um trecho, se não houver. get_the_excerpt()não imita isso, verifique a fonte, está acessando apenas a variável membro da $postqual é post_excerpt. Veja também o link do codex na resposta.
hakre 31/12/11
3
A partir da entrada do Codex the_excerpt: "ele exibirá um trecho automático que se refere às 55 primeiras palavras do conteúdo da publicação". Eu estou olhando para imitar esse comportamento fora do circuito.
Jlengstorf
Bem, crie um segundo loop temporariamente e consulte esse arquivo por sua identificação, provavelmente para uma solução rápida. Veja Loops secundários - codex.wordpress.org/Function_Reference/…
hakre
11
Obrigado pelo link. Eu sabia que poderia criar um loop adicional, mas parece exagero. Minha solução foi adicionar um filtro. Eu vejo isso como uma pequena graxa de cotovelo agora por muito menos código depois.
Jlengstorf # 1/12
0

Você pode usar minha função personalizada para arquivar o conteúdo (é do NARGA Framework )

  • Se a postagem tiver um trecho personalizado, exiba-o
  • Gerar automaticamente trecho do conteúdo, se a postagem não tiver um certificado personalizado
  • Auto-atalho de recorte automático, código HTML, remova, [...] adicione texto "Leia mais" (traduzível)

        /**
        * 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');
Narga
fonte