Ottenere l'excerpt tramite ID
Perché non è possibile ottenere l'excerpt tramite ID come avviene per il titolo e la maggior parte degli altri elementi?
Ad esempio: get_the_excerpt(ID). So come usare la funzione $post->post_excerpt ma questa non restituisce parte del contenuto se non è stato inserito un excerpt, semplicemente non restituisce nulla.
Quello che sto cercando di fare è ottenere l'excerpt tramite ID se esiste, e se non c'è un excerpt per quell'ID ma c'è del contenuto, ottenere invece parte del contenuto.
Come si potrebbe fare?
Qualche idea?
Fantastico...
EDIT --
Codice sorgente del Loop come richiesto.
<?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>
Ciao @Robin I. Knight:
Considero get_the_excerpt()
una funzione con un design legacy. Con l'evoluzione di WordPress ci sono molti nuovi casi d'uso in cui non si adatta bene, mentre le funzioni più recenti per ottenere diversi tipi di dati sono più appropriate. Un esempio è l'uso ormai frequente di un array $args
per le opzioni della funzione.
Ma è facile adattarla alle tue esigenze. Ecco una funzione alternativa che puoi utilizzare e inserire in qualsiasi punto del file functions.php
del tuo 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;
}
Non l'ho testata ma sono abbastanza sicuro che sia corretta. Se non soddisfa le tue esigenze, per favore fornisci maggiori dettagli e potrò suggerirti altre soluzioni.

Funziona. Più o meno. Risultati molto strani. Sicuramente sta svolgendo la sua funzione, ma i risultati sono particolari. Lo sto usando insieme a GET_Posts e per qualche motivo i primi due post ottenuti sono sempre gli stessi. Ecco un link dove potete vedere cosa intendo. Guardate i 4 post sulla destra. http://www.divethegap.com/update/community/feedback/2010/06/steve-riches/

@Robin I Knight: Per favore posta il codice sorgente del tuo loop come aggiornamento alla tua domanda; è molto difficile debuggare il codice senza vederlo. Potrebbe anche essere un plugin che causa il problema; prova a disabilitarli uno alla volta.

A proposito, ho cambiato il nome della funzione in get_the_excerpt_id($post_id)

@Robin I Knight - Non vedo nulla nel tuo loop, ma potresti provare a chiamare setup_postdata($post)
all'inizio del tuo loop, come suggerisce @Rarst. Se non funziona potrebbe essere un plugin che devi disattivare; hai provato? E probabilmente non dovresti chiamarla get_the_excerpt_id()
perché WordPress potrebbe aggiungere quella funzione in futuro e rompere il tuo sito. E potresti probabilmente fare a meno della funzione nel tuo loop usando foreach($stories as $story): global $post; $post = $story;
invece.

La meccanica degli excerpt è estremamente confusa. Non è una risposta precisa alla tua domanda, ma in generale se hai bisogno di far funzionare i tag del template, specifici del Loop, con un array restituito da get_posts()
puoi emulare il Loop in questo modo:
$stories = get_posts();
foreach ($stories as $post) {
setup_postdata($post);
// roba
}
wp_reset_postdata();

@cwd se si utilizza solo setup_postdata()
la query globale non viene influenzata e solo i dati del post devono essere resettati.

Questa soluzione è molto più pulita rispetto a memorizzare il post in un'altra variabile e richiedere un altro post solo per renderlo globale. +1

C'è una nuova funzione dalla versione 3.3.0: wp_trim_words
La sto utilizzando al di fuori del loop nel seguente modo:
<?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>Questo articolo può essere letto solo dagli abbonati.</strong></p>
<?php } } ?>
Questa non va confusa con wp_trim_excerpt che apparentemente funziona solo all'interno del loop, poiché chiama internamente the_content().

Per aggiungere alla risposta di MikeSchinkel, che per qualche motivo non ha funzionato per me, ho dovuto aggiungere la riga setup_postdata per farlo funzionare.
function get_the_excerpt( $post_id ){
global $post;
$save_post = $post;
$post = get_post($post_id);
setup_postdata( $post ); // ciao
$output = get_the_excerpt();
$post = $save_post;
return $output;
}
Presumo che se stai usando questo al di fuori del loop, non dovrebbe interferire con altri setup_postdata in corso.
Saluti

Se TUTTI i tuoi articoli hanno il tag <!--more-->
, allora puoi utilizzare il seguente codice insieme al tuo codice precedente:
$sjc_excerpt = explode( '<!--more-->', $post->post_content);
echo wpautop( $sjc_excerpt[0] );
Ovviamente, se hai articoli che non contengono il tag <!--more-->
, verranno visualizzati per intero. Funziona nel mio caso, ma non per tutti...

Considero get_the_excerpt()
una funzione con un design legacy. Con la crescita dell'utilizzo di WordPress, ci sono molti casi d'uso più recenti in cui non si adatta bene, mentre le funzioni più nuove per ottenere diversi dati sì. Un esempio è l'uso ormai frequente di un array $args
per le opzioni della funzione.
Ma è facile adattarla alle proprie esigenze. Ecco una funzione alternativa che puoi utilizzare e inserire ovunque nel file functions.php
del tuo tema:
function robins_get_the_excerpt($post_id) {
global $post;
$save_post = $post;
$post = get_post($post_id);
setup_postdata($post); // Aggiunto per garantire il corretto funzionamento
$output = get_the_excerpt();
$post = $save_post;
wp_reset_postdata(); // Ripristina i dati del post originale
return $output;
}
Per completare la risposta di MikeSchinkel, che per qualche motivo non funzionava nel mio caso. Ho dovuto aggiungere la riga setup_postdata per farlo funzionare correttamente.

Questo è un piccolo snippet di due righe che utilizzo spesso sfruttando wp_trim_words. Mi trovo costantemente nella necessità di avere le funzionalità di abbreviazione e "leggi tutto" al di fuori del loop. Qualcun altro potrebbe trovarlo utile. Ecco cosa uso per:
- Ottenere l'Excerpt tramite ID del POST
- Ottenere il Contenuto del Post se nessun Excerpt è stato impostato,
- Impostare la lunghezza in parole dell'Excerpt
- Scegliere il Contenuto per il "Leggi tutto" (Link/Testo)
Lo inserisco direttamente inline nel template personalizzato che sto modificando.
//Ottieni l'oggetto Post
$dapost = get_post(ID_POST);
//Ottieni l'Excerpt
$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'> ".__('Scopri di più', 'translation')."</a>" );
Dettagli
1. Il contenuto dell'Excerpt
Ottieni l'Excerpt tramite ID del Post, ma ottieni il Contenuto del Post se nessun Excerpt è stato impostato.
Sto utilizzando la sintassi breve If/Else di PHP.
$dapost = get_post(ID_POST);
apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content
2. Lunghezza delle parole
Imposta il numero di parole nell'Excerpt a 20
"20"
3. Scegli il Contenuto per "Leggi tutto" (Link/Testo)
"<a href='$dapost->guid'> ".__('Scopri di più', 'translation')."</a>"
Ho usato $dapost->guid
per ottenere l'URL, perché non avevo bisogno di URL amichevoli e volevo evitare un'altra chiamata al database. Potresti sempre usare get_the_permalink.
Consulta wp_trim_words nella documentazione di Wordpress.

A partire da WP 4.5.0 è possibile utilizzare l'ID del post come parametro
get_the_excerpt( $post->ID )
Fonte:https://developer.wordpress.org/reference/functions/get_the_excerpt/

Per quanto fastidioso possa essere, in realtà è abbastanza semplice da fare
// Ottiene l'estratto di un post dato il suo ID
function cameronjonesweb_get_excerpt_by_id( $post_id ) {
// Applica i filtri all'estratto e lo restituisce dopo averlo trimmato
return apply_filters( 'get_the_excerpt', wp_trim_excerpt( '', $post_id ), $post_id );
}
