Obtenha trechos usando get_the_excerpt fora de um loop

31

Eu tenho um código que chama get_the_title()e funciona, mas get_the_excerpt()retorna vazio. Como posso fazer funcionar?

Este código está dentro de um plugin chamado "WP Facebook Open Graph protocol". Aqui está a parte que eu quero mudar:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Aqui, has_excerptsempre falhe e get_the_excerpt($post->ID)não funcione mais (descontinuado).

Então, como posso exibir o trecho lá?

ps: também estou usando o plug-in "Advanced Excerpt"

ariel
fonte
ok, entendeu usando my_excerpt($post->post_content, get_the_excerpt())e usando a my_excerpt()função de wordpress.stackexchange.com/questions/6961/...
ariel
3
Adicione a solução que você encontrou como resposta, para que isso não assombre o site como uma pergunta sem resposta. :)
Primeiro,
Apenas use the_post() (funciona também no modelo de postagem única) a função antes de chamá- get_the_excerpt()lo, configurando os dados necessários para você.
Sisir 18/09/14

Respostas:

29

Encontrei essa pergunta ao analisar como fazer isso sem o objeto post.

Minha pesquisa adicional descobriu essa técnica inteligente:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));

cale_b
fonte
1
Isso deve ser aceito como resposta, pois é a maneira recomendada de extrair dados para fora do loop. Também não requer nenhuma função personalizada ou substituição da $postvariável global.
MacK
4
retorna string vazia.
Kyaw Tun
1
@KyawTun - ele funciona, desde que $post_idestá definido (que é o valor de $post_idE? $post_idÉ um válido, legítimo pós ID.
cale_b
2
@cale_b Obrigado. Eu uso a consulta get_posts e obter ID da matriz resultante. O objeto de postagem tem post_title, post_content, ID, etc. Mas não está funcionando.
Kyaw Tun
Se você precisar APENAS da marca TEXT e não <p>, incluída no filtro _excerpt, use o filtro "get_the_excerpt", para que o filtro acima se torne: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id)) ); isso fornecerá apenas o texto RAW que você pode inserir em qualquer lugar da sua própria marcação.
Mohsin
22

Como parece que você já possui o objeto de postagem para o qual precisa do trecho, basta forçar o trabalho:

setup_postdata( $post );
$excerpt = get_the_excerpt();

A setup_postdata()função globalizará o $postobjeto e o disponibilizará para a função de loop antigo regular. Quando você está dentro do loop, você liga the_post()e isso define as coisas para você ... fora do loop, você precisa forçá-lo manualmente.

EAMann
fonte
1
Isso funciona, mas: "Você deve passar uma referência à $postvariável global , caso contrário, funções como the_title()não funcionam corretamente". global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
chegue em 19/01/19
setup_postdata($post);FTW !!!!
Squarecandy
18

Tente o seguinte:

Crie uma nova função em functions.php e, em seguida, chame-a de qualquer lugar.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Aqui está uma postagem descrevendo o código.

Withers Davis
fonte
1
Excelente encontrar meu amigo. Eu nunca entendi por que o WordPress teria reprovado uma função tão crítica. Isso está efetivamente reconstruindo-o do zero, mas funciona. Dada a frequência com que usamos o trecho fora do loop com recursos como plug-ins de compartilhamento social, ele provavelmente deveria ter permanecido parte do núcleo.
Ideias imperativas
1
A resposta da EAMann é uma abordagem muito melhor para esse problema e deve ser considerada a melhor prática. Essa abordagem está basicamente duplicando as partes internas do Core em vez de usar a API.
Ian Dunn
9

Agora você pode simplesmente usar a get_the_excerpt( $postID )função Desde: WordPress 4.5.0 introduziu o $postparâmetro.

estivador
fonte
1
Esta deve ser uma nova resposta aceita, pois estamos na era do WP 4.5 +.
Matija Mrkaic
18
Isso não funcionará se o trecho estiver vazio, pois o wp_trim_excerptfiltro retornará o trecho para a postagem atual.
Dylan
9
Veja core.trac.wordpress.org/ticket/36934 para obter detalhes sobre o que @Dylan disse
kraftner
5

consegui usando my_excerpt($post->post_content, get_the_excerpt())e usando a my_excerpt()função de Using wp_trim_excerpt para obter the_excerpt () fora do loop

ariel
fonte
2
As respostas somente para links não são boas. Copie o código relevante aqui. Quando esse link é quebrado, o site está inoperante / inativo, essa resposta não tem valor.
Cale_b
Funcionou perfeitamente para mim!
Saikat
1

Caso você não tenha o objeto de postagem, aqui está uma função curta como a de Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
OKParrothead
fonte
Mas o solicitante tem um objeto de postagem, conforme declarado na pergunta.
fuxia
3
Corrija-me se eu estiver errado, este método irá retornar o trecho manual, mas não vai gerar um, se necessário
Bill
1

Isto é para quando você deseja usar get_the_excerpt()fora do loop:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}
Gixty
fonte
Esta é a maneira mais direta de fazê-lo. Não tenho certeza se é ótimo em termos de desempenho. Você ainda recebe o meu +1
Bill
1

Se você deseja gerar o trecho automaticamente a partir do conteúdo em uma linha - você pode usar uma wp_trim_wordsfunção como esta:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
Picard
fonte
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
fonte
Por favor edite sua resposta , e adicionar uma explicação: por que isso poderia resolver o problema?
Fuxia