OBTENHA o trecho por ID

31

Por que não se pode obter o trecho por ID, como no título e na maioria dos outros elementos.

por exemplo. get_the_excerpt (ID). Eu sei como usá-lo com a função $ post-> post_excerpt, mas que 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,

Maravilhoso ...

EDIT -

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;?>
Robin I Knight
fonte
o que exatamente são "alguns" do conteúdo?
kaiser
A função trecho no wordpress retorna o trecho de uma postagem. Se o post não tem um trecho ele retorna um determinado número de caracteres do conteúdo seguido por '...' ou 'leia mais' ou qualquer que seja o modelo fornece
Robin I Cavaleiro
1
Não é uma PITA, mas as regras da comunidade não permitem assinaturas e fechamentos padrão. Para cumprir as regras e evitar que Jeff Atwood envie uma mensagem severa depois de editar todas as suas perguntas, pare de usar "Marvelous" como um fechamento. (E por favor, não mate o mensageiro)
MikeSchinkel

Respostas:

20

Olá, Robin I. Knight:

Eu vejo get_the_excerpt()como uma função com design herdado. À medida que o uso do WordPress cresce, há muitos casos de uso mais recentes, onde ele não se encaixa, mas onde as funções mais recentes para obter dados diferentes. Um exemplo é o uso freqüente de uma $argsvariedade de opções de funções.

Mas é fácil de corrigir para suas necessidades. Aqui está uma função alternativa que você pode usar e colocar em qualquer lugar no functions.phparquivo 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;
}

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

MikeSchinkel
fonte
Funciona. Tipo de. Resultados muito ímpares. Definitivamente, está desempenhando sua função, mas os resultados são ímpares. Estou usando-o em conjunto com GET_Posts e, por algum motivo, os 2 principais posts são sempre os mesmos. Aqui está um link e você verá o que quero dizer. Veja os 4 posts no lado direito. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight
@ Robin I Knight: Por favor, poste seu código-fonte de loop como uma atualização para sua pergunta; é muito difícil depurar código sem ver o código. Também é possivelmente um plugin que está causando o problema; tente desativá-los um de cada vez.
21811 MikeSchinkel
Código-fonte do loop em questão acima ^^
Robin I Knight
BTW eu mudei o nome da função para get_the_excerpt_id ($ post_id)
Robin I Knight
@ Robin I Knight - Não vejo nada no seu loop, mas você pode tentar ligar setup_postdata($post)no início do loop, como sugere o @Rarst. Se isso não funcionar, pode ser um plugin que você precisa desativar; você já tentou isso? E você provavelmente não quer chamá-lo, get_the_excerpt_id()porque o WordPress pode adicionar essa função no futuro e quebrar seu site. E você provavelmente poderia ficar sem a função no seu loop usando em seu foreach($stories as $story): global $post; $post = $story;lugar.
precisa saber é o seguinte
16

A mecânica do trecho é extremamente confusa. Não é uma resposta precisa para sua pergunta, mas, em geral, se você precisar fazer tags de modelo, específicas para Loop, funcionarem com a matriz retornada, get_posts()é possível emular o Loop assim:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
Rarst
fonte
e quanto a wp_reset_query (); ?
Cwd
1
@cwd se apenas o uso setup_postdata()da consulta global não for afetado e apenas os dados de publicação precisarem ser redefinidos.
Rarst
Essa solução é muito mais limpa do que armazenar a postagem em outra var e exigir outra postagem apenas para torná-la global. 1
Barry Kooij
Obrigado @Rarst que me ajudou. Adicionando setup_postdata ($ post); resolvido meus problemas
Simon
8

Há uma nova função desde 3.3.0: wp_trim_words

Estou usando-o fora do loop da seguinte maneira:

 <?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 o wp_trim_excerpt, que aparentemente só funciona dentro do loop, já que ele chama the_content () internamente.

lkraav
fonte
6

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

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, não deve interferir com outros setup_postdata.

Felicidades

Dan Brown
fonte
Tentei a resposta de MikeSchinkel e não funcionou para mim. A configuração dos dados da postagem fez o truque. No meu caso, sem o 'setup_postdata', a função retornou o título + trecho da postagem principal.
turzifer
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.

Dominic P
fonte
1

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

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

Obviamente, se você tiver alguma postagem que não tenha a <!--more-->tag, elas serão mostradas na íntegra. Funciona na minha situação, mas não para todos ...

Stephen Cronin
fonte
1

Eu vejo get_the_excerpt()como uma função com design herdado. À medida que o uso do WordPress cresce, há muitos casos de uso mais recentes, onde ele não se encaixa, mas onde as funções mais recentes para obter dados diferentes. Um exemplo é o uso freqüente de uma $argsvariedade de opções de funções.

Mas é fácil de corrigir para suas necessidades. Aqui está uma função alternativa que você pode usar e colocar em qualquer lugar no functions.phparquivo 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 acrescentar à resposta de MikeSchinkel, que por algum motivo não funcionaria para mim. Eu tive que adicionar a linha setup_postdata para fazê-lo funcionar.

Jude
fonte
Isso precisa wp_reset_post_data()funcionar dentro do loop?
Chris Rosa
Aparentemente (depois de percorrer esta casa em particular) agora faz parte do núcleo.
Chris Rosa
0

Este é um pouco de duas linhas que eu uso muito utilizando wp_trim_words . Eu constantemente me vejo precisando da abreviação e leio mais funcionalidades fora do loop. Alguém mais pode achar isso útil. Então é isso que eu uso para:

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

Coloquei 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>" );

Demolir

1.O conteúdo do excerto

Obter o trecho por ID da postagem, mas obter conteúdo da postagem Se nenhum trecho foi 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 Ler mais conteúdo (link / texto)

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

Eu costumava $dapost->guidobter o URL, porque não precisava 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.

Brev Tiw
fonte
0

Isso funcionou para mim:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
Rijo KP
fonte
-2

Isso é mais rápido:

global $post;
return get_post($post_id)->post_excerpt;
Maxime Kieffer
fonte
1
Não quando o trecho está vazio ... como mencionado na pergunta.
fuxia
Na verdade não quando uma exceção é gerada automaticamente
Joshc
Downvoted como este não é útil
Pieter Goosen