OBTENGA el extracto por ID

29

¿Por qué es que no se puede obtener el extracto por ID como con el título y la mayoría de los otros elementos?

por ejemplo. get_the_excerpt (ID). Sé cómo usarlo con la función $ post- > post_excerpt pero eso no devuelve parte del contenido si no se ingresó ningún extracto, simplemente no devuelve nada.

Entonces, lo que estoy tratando de hacer es obtener el extracto por ID si hay un extracto, y si no hay un extracto con esa ID pero hay algo de contenido, para obtener algo del contenido en su lugar.

¿Cómo se haría eso?

Cualquier idea,

Maravilloso ...

EDITAR -

Código fuente de bucle según lo 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;?>
    
pregunta Robin I Knight 19.03.2011 - 18:34

11 respuestas

19

Hola @Robin I. Knight:

Veo get_the_excerpt() como una función con diseño heredado. A medida que el uso de WordPress ha crecido, hay muchos casos de uso más nuevos en los que no cabe, pero donde las funciones más nuevas para obtener datos diferentes sí. Un ejemplo es el uso frecuente de un conjunto de opciones de función $args .

Pero es fácil de arreglar para tus necesidades. Esta es una función alternativa que puede usar y que puede colocar en cualquier lugar del archivo functions.php de su 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;
}

No lo he probado, pero estoy bastante seguro de que lo hice bien. Si esto no satisface sus necesidades, por favor, elabore y quizás pueda hacer otras sugerencias.

    
respondido por el MikeSchinkel 19.03.2011 - 19:33
15

La mecánica del extracto es extremadamente confusa. No es una respuesta precisa a su pregunta, pero en general, si necesita hacer etiquetas de plantilla, específicas de Loop, trabajar con la matriz devuelta por get_posts() , puede emular Loop de esta manera:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
    
respondido por el Rarst 20.03.2011 - 15:12
8

Hay una nueva función desde la 3.3.0: wp_trim_words

Lo estoy usando fuera del bucle de la siguiente manera:

 <?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 } } ?>

Esto no debe confundirse con wp_trim_excerpt que aparentemente solo funciona dentro del bucle, ya que llama a the_content () internamente .

    
respondido por el lkraav 14.01.2012 - 23:43
6

Solo para agregar a la respuesta de MikeSchinkel, que por alguna razón no funcionaría para mí. Tuve que agregar la línea setup_postdata para que funcione.

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;

}

Supongo que si estás usando esto fuera del bucle, entonces no debería interferir con otros setup_postdata que están sucediendo.

Saludos

    
respondido por el danbrown 30.08.2013 - 11:57
2

Sobre la base de la respuesta de @ Maxime, ¿funcionaría?

$post = get_post( $id );

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

Me parece bastante sencillo, pero me pregunto si me estoy perdiendo algo.

    
respondido por el Dominic P 02.05.2013 - 23:53
1

Si TODAS sus publicaciones tienen la etiqueta <!--more--> , entonces puede usar lo siguiente con su código de arriba:

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

Por supuesto, si tienes alguna publicación que no tenga la etiqueta <!--more--> , se mostrarán en su totalidad. Funciona en mi situación, pero no para todos ...

    
respondido por el Stephen Cronin 11.07.2011 - 15:01
1

Veo get_the_excerpt() como una función con diseño heredado. A medida que el uso de WordPress ha crecido, hay muchos casos de uso más nuevos en los que no cabe, pero donde las funciones más nuevas para obtener datos diferentes sí. Un ejemplo es el uso frecuente de un conjunto de opciones de función $args .

Pero es fácil de arreglar para tus necesidades. Esta es una función alternativa que puede usar y que puede colocar en cualquier lugar del archivo functions.php de su 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;
}

Solo para agregar a la respuesta de MikeSchinkel, que por alguna razón no funcionaría para mí. Tuve que agregar la línea setup_postdata para que funcione.

    
respondido por el Jude 19.04.2016 - 14:51
0

Este es un poco de dos líneas que uso mucho utilizando wp_trim_words . Constantemente me encuentro necesitando la abreviatura y leo más funcionalidades fuera del bucle. Alguien más puede encontrar esto útil. Así que esto es lo que uso para:

  1. Obtenga el Extracto de ID POST
  2. Obtener contenido de la publicación si no se ha establecido ningún extracto,
  3. Establezca la longitud de palabra del extracto
  4. Elija el contenido para leer más (enlace / texto)

Pongo esto en línea, directamente en la plantilla personalizada que estoy 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>" );

Desglosar

1.El contenido del extracto

Obtenga el extracto por ID de publicación pero, obtenga contenido de publicación si no se ha establecido ningún extracto.

Estoy usando la abreviatura de PHP If / Else .

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

2. Longitud de palabra

Establezca la cantidad de palabras en el Extracto en 20

    "20"

3. Elija ReadMore Content (Link / Text)

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

Usé $dapost->guid para obtener la URL, porque no necesitaba URL amigables y quería evitar otra llamada a la base de datos. Siempre se puede usar get_the_permalink.

Consulte wp_trim_words en la Documentación de Wordpress.

    
respondido por el Brev Tiw 08.06.2016 - 06:31
0

Esto me funcionó:

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

Desde WP 4.5.0 es posible usar la ID de publicación como parámetro get_the_excerpt( $post->ID )

Fuente: enlace

    
respondido por el Jorge Cordero 07.09.2018 - 20:42
-2

Esto es más rápido:

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

Lea otras preguntas en las etiquetas