OBTENER el extracto por ID

31

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

p.ej. 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 parte del contenido.

¿Cómo haría uno eso?

Algunas ideas,

Maravilloso ...

EDITAR -

Código fuente del 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;?>
Robin I Knight
fuente
¿Qué es exactamente "algo" del contenido?
Kaiser
La función de extracto en WordPress devuelve el extracto de una publicación. Si la publicación no tiene un extracto, devuelve un cierto número de caracteres del contenido seguido de '...' o 'leer más' o lo que sea que la plantilla proporcione
Robin I Knight
1
No para ser un PITA, pero las reglas de la comunidad no permiten firmas y cierres estándar. Para cumplir con las reglas y evitar que Jeff Atwood le envíe un mensaje severo después de editar todas sus preguntas, deje de usar "Maravilloso" como cierre. (Y por favor no disparen al mensajero)
MikeSchinkel

Respuestas:

20

Hola @Robin I. Knight:

Lo 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 encaja pero donde sí funcionan las funciones más nuevas para obtener datos diferentes. Un ejemplo es el uso frecuente de una $argsvariedad de opciones de funciones.

Pero es fácil de solucionar según sus necesidades. Aquí hay una función alternativa que puede usar que puede colocar en cualquier parte del functions.phparchivo 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, explique y tal vez pueda hacer otras sugerencias.

MikeSchinkel
fuente
Funciona. Más o menos. Resultados muy extraños. Definitivamente está realizando su función, pero los resultados son extraños. Lo estoy usando junto con GET_Posts y, por alguna razón, las 2 publicaciones principales son siempre las mismas. Aquí hay un enlace y verás lo que quiero decir. Mira las 4 publicaciones en el lado derecho. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight
@ Robin I Knight: publique su código fuente de bucle como una actualización de su pregunta; Es muy difícil depurar el código sin ver el código. También es posiblemente un complemento que está causando el problema; intente deshabilitarlos uno a la vez.
MikeSchinkel
Código fuente del bucle en cuestión arriba ^^
Robin I Knight
Por cierto, cambié el nombre de la función a get_the_excerpt_id ($ post_id)
Robin I Knight
@Robin I Knight: no veo nada en tu bucle, pero puedes intentar llamar setup_postdata($post)al comienzo de tu bucle, como sugiere @Rarst. Si eso no funciona, podría ser un complemento que debe deshabilitar; has intentado eso? Y probablemente no quiera llamarlo get_the_excerpt_id()porque WordPress podría agregar esa función en el futuro y romper su sitio. Y probablemente podría prescindir de la función en su bucle utilizando en su foreach($stories as $story): global $post; $post = $story;lugar.
MikeSchinkel
16

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, que funcionen con la matriz devuelta get_posts(), puede emular Loop de esta manera:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
Rarst
fuente
¿Qué pasa con wp_reset_query (); ?
cwd
1
@cwd si solo el uso de setup_postdata()la consulta global no se ve afectado y solo se deben restablecer los datos publicados.
Rarst
Esta solución es mucho más limpia que almacenar la publicación en otra variable y solicitar otra publicación solo para que sea global. +1
Barry Kooij
Gracias @Rarst que me ayudó. Agregar setup_postdata ($ post); resuelto mis problemas
Simon
8

Hay una nueva función desde 3.3.0: wp_trim_words

Lo estoy usando fuera del ciclo 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 invoca the_content () internamente.

lkraav
fuente
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á usando esto fuera del ciclo, entonces no debería interferir con otros setup_postdata.

Aclamaciones

Dan Brown
fuente
Intenté la respuesta de MikeSchinkel y no funcionó para mí. La configuración de los datos de publicación hizo el truco. En mi caso, sin 'setup_postdata', la función devolvió el título + extracto de la publicación principal.
turzifer
2

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

$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.

Dominic P
fuente
1

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

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

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

Stephen Cronin
fuente
1

Lo 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 encaja pero donde sí funcionan las funciones más nuevas para obtener datos diferentes. Un ejemplo es el uso frecuente de una $argsvariedad de opciones de funciones.

Pero es fácil de solucionar según sus necesidades. Aquí hay una función alternativa que puede usar que puede colocar en cualquier parte del functions.phparchivo 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.

Judas
fuente
¿Esto necesita wp_reset_post_data()funcionar dentro del bucle?
Chris Pink
Aparentemente (después de recorrer esta casa en particular) ahora es parte del núcleo.
Chris Pink
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 ciclo. Alguien más puede encontrar esto útil. Entonces esto es lo que uso para:

  1. Obtenga el extracto por ID POST
  2. Obtener contenido de la publicación Si no se ha establecido un extracto,
  3. Establecer la longitud de la palabra del extracto
  4. Elija el contenido para Leer más (Enlace / Texto)

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

Descompostura

1. El contenido del extracto

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

Estoy usando la abreviatura de If / Else PHP .

    $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 Leer más contenido (Enlace / Texto)

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

Solía $dapost->guidobtener la URL, porque no necesitaba URL amigables y quería evitar otra llamada a la base de datos. Siempre puedes usar get_the_permalink.

Ver wp_trim_words en la documentación de Wordpress.

Brev Tiw
fuente
0

Esto funcionó para mí:

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

Esto es más rápido:

global $post;
return get_post($post_id)->post_excerpt;
Maxime Kieffer
fuente
1
No cuando el extracto está vacío ... como se menciona en la pregunta.
fuxia
De hecho, no cuando se genera una excepción automáticamente
Joshc
Votado como esto no es útil
Pieter Goosen