OBTER o trecho por ID

29

Por que não é possível obter o trecho por ID como o título e a maioria dos outros elementos?

por exemplo. get_the_excerpt (ID). Eu sei como usá-lo com a função $ post- > post_excerpt, mas isso não retorna parte do conteúdo, se nenhum trecho foi inserido, simplesmente não retorna nada.

Então, o que estou tentando fazer é obter o trecho por ID, se houver um trecho, e se não houver um trecho com esse ID, mas houver algum conteúdo, para obter parte do conteúdo.

Como alguém faria isso?

Alguma ideia,

Maravilhosa ...

EDITAR

Código fonte do loop conforme solicitado.

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
                  </div>
                  </div>

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>



<?php echo $excerpt;?></div>
              <?php endforeach;?>
    
por Robin I Knight 19.03.2011 / 18:34
fonte

11 respostas

19

Oi @Robin I. Cavaleiro:

Eu vejo o get_the_excerpt() como uma função do design herdado. Como o uso do WordPress tem crescido, há muitos casos de uso mais recentes, nos quais ele não se encaixa, mas onde as funções mais recentes para obter dados diferentes o fazem. Um exemplo é o uso agora freqüente de uma matriz $args de opções de função.

Mas é fácil corrigir suas necessidades. Aqui está uma função alternativa que você pode usar e que pode colocar em qualquer lugar no arquivo functions.php do seu tema:

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;
}

Eu não testei, mas tenho certeza que acertei. Se isso não atender às suas necessidades, por favor, explique e talvez eu possa fazer outras sugestões.

    
por MikeSchinkel 19.03.2011 / 19:33
fonte
15

A mecânica do trecho é extremamente confusa. Não é uma resposta precisa à sua pergunta, mas, em geral, se você precisar criar tags de template, específicas para Loop, trabalhe com array retornado por get_posts() , você pode emular Loop assim:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
    
por Rarst 20.03.2011 / 15:12
fonte
8

Existe uma nova função desde 3.3.0: wp_trim_words

Estou usando fora do loop da seguinte forma:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

Isso não deve ser confundido com wp_trim_excerpt que aparentemente funciona apenas dentro do loop, já que chama internamente o_content () .

    
por lkraav 14.01.2012 / 23:43
fonte
6

Apenas para adicionar à resposta de MikeSchinkel, que por alguma razão não funcionaria para mim. Eu tive que adicionar a linha setup_postdata para fazer o trabalho.

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

Estou assumindo que, se você estiver usando isso fora do loop, ele não deve interferir em outras configurações_postdata acontecendo.

Felicidades

    
por danbrown 30.08.2013 / 11:57
fonte
2

Com base na resposta do @ Maxime, isso funcionaria?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

Parece bastante direto para mim, mas estou me perguntando se estou perdendo alguma coisa.

    
por Dominic P 02.05.2013 / 23:53
fonte
1

Se ALL suas postagens tiverem a tag <!--more--> , você poderá usar o seguinte com seu código acima:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

É claro que, se você tiver alguma postagem que não tenha a tag <!--more--> , ela será mostrada na íntegra. Funciona na minha situação, mas não para todos ...

    
por Stephen Cronin 11.07.2011 / 15:01
fonte
1

Eu vejo o get_the_excerpt() como uma função do design herdado. Como o uso do WordPress tem crescido, há muitos casos de uso mais recentes, nos quais ele não se encaixa, mas onde as funções mais recentes para obter dados diferentes o fazem. Um exemplo é o uso agora freqüente de uma matriz $args de opções de função.

Mas é fácil corrigir suas necessidades. Aqui está uma função alternativa que você pode usar e que pode colocar em qualquer lugar no arquivo functions.php do seu tema:

function robins_get_the_excerpt($post_id) {
   global $post;  
   $save_post = $post;
   $post = get_post($post_id);
   $output = get_the_excerpt();
   $post = $save_post;
   return $output;
}

Apenas para adicionar à resposta de MikeSchinkel, que por alguma razão não funcionaria para mim. Eu tive que adicionar a linha setup_postdata para fazê-lo funcionar.

    
por Jude 19.04.2016 / 14:51
fonte
0

Este é um pequeno verso que eu uso muito utilizando wp_trim_words . Eu constantemente me encontrando precisando da abreviação e lendo mais funcionalidades fora do loop. Alguém mais pode achar isso útil. Então é isso que eu uso para:

  1. Obter o trecho por ID do POST
  2. Obter conteúdo da postagem Se nenhum trecho tiver sido definido,
  3. Defina o tamanho da palavra do trecho
  4. Escolha o conteúdo para o Leia mais (link / texto)

Eu coloco isso em linha, diretamente no modelo personalizado que estou editando.

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content  ), "20", "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>" );

Break Down

1.O conteúdo do trecho

Obtenha o trecho por ID do post, mas obtenha o conteúdo da postagem se nenhum trecho tiver sido definido.

Estou usando a abreviação If / Else PHP .

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2. Comprimento da palavra

Defina a quantidade de palavras no trecho para 20

    "20"

3. Escolha o Conteúdo LeiaMais (Link / Texto)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

Eu usei $dapost->guid para obter o URL, porque não precisei de URLs amigáveis e queria evitar outra chamada para o banco de dados. Você sempre pode usar get_the_permalink.

Veja wp_trim_words na documentação do Wordpress.

    
por Brev Tiw 08.06.2016 / 06:31
fonte
0

Isso funcionou para mim:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
    
por Rijo K P 26.09.2017 / 12:35
fonte
0

Do WP 4.5.0 é possível usar o ID da postagem como parâmetro get_the_excerpt( $post->ID )

Fonte: enlace

    
por Jorge Cordero 07.09.2018 / 20:42
fonte
-2

Isso é mais rápido:

global $post;
return get_post($post_id)->post_excerpt;
    
por Maxime Kieffer 12.11.2012 / 13:13
fonte

Tags