Ottenere l'excerpt tramite ID

19 mar 2011, 19:34:36
Visualizzazioni: 95.1K
Voti: 34

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>
3
Commenti

cosa significa esattamente "parte" del contenuto?

kaiser kaiser
19 mar 2011 19:47:10

La funzione excerpt in WordPress restituisce l'estratto di un articolo. Se l'articolo non ha un estratto, restituisce un certo numero di caratteri del contenuto seguito da '...' o 'leggi tutto' o qualunque cosa il template preveda

Robin I Knight Robin I Knight
19 mar 2011 19:48:28

Non per essere pedante, ma le regole della community vietano firme e chiusure standard. Quindi, per rispettare le regole ed evitare che Jeff Atwood ti mandi un messaggio severo dopo aver modificato tutte le tue domande, per favore smetti di usare "Marvellous" come chiusura. (E per favore non sparare al messaggero)

MikeSchinkel MikeSchinkel
19 mar 2011 20:26:46
Tutte le risposte alla domanda 11
5
21

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.

19 mar 2011 20:33:57
Commenti

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 Robin I Knight
19 mar 2011 21:48:36

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

MikeSchinkel MikeSchinkel
19 mar 2011 22:19:32

Il codice sorgente del loop in questione è sopra ^^

Robin I Knight Robin I Knight
19 mar 2011 22:28:42

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

Robin I Knight Robin I Knight
20 mar 2011 17:11:52

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

MikeSchinkel MikeSchinkel
20 mar 2011 21:54:25
4
16

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();
20 mar 2011 16:12:27
Commenti

e riguardo wp_reset_query(); ?

cwd cwd
27 gen 2012 18:39:36

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

Rarst Rarst
27 gen 2012 20:47:39

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

Barry Kooij Barry Kooij
10 apr 2013 19:02:14

Grazie @Rarst, il tuo suggerimento mi è stato d'aiuto. Aggiungere setup_postdata($post); ha risolto i miei problemi

Simon Simon
14 nov 2014 22:55:18
0

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().

15 gen 2012 00:43:37
1

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

30 ago 2013 12:57:42
Commenti

Ho provato la risposta di MikeSchinkel ma non ha funzionato per me. Impostare i dati del post ha risolto il problema. Nel mio caso, senza 'setup_postdata', la funzione restituiva il titolo+riassunto del post genitore.

turzifer turzifer
25 set 2016 12:49:32
0

Basandomi sulla risposta di @Maxime, questo funzionerebbe?

$post = get_post( $id );

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

Mi sembra abbastanza semplice, ma mi chiedo se sto tralasciando qualcosa.

3 mag 2013 00:53:04
0

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

11 lug 2011 16:01:45
2

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.

19 apr 2016 15:51:27
Commenti

Serve wp_reset_postdata() per funzionare all'interno del loop?

Chris Pink Chris Pink
10 lug 2017 12:26:14

A quanto pare (dopo aver girato intorno a questa particolare casa) ora fa parte del core.

Chris Pink Chris Pink
10 lug 2017 12:29:07
0

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:

  1. Ottenere l'Excerpt tramite ID del POST
  2. Ottenere il Contenuto del Post se nessun Excerpt è stato impostato,
  3. Impostare la lunghezza in parole dell'Excerpt
  4. 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.

8 giu 2016 07:31:41
0

Questo ha funzionato per me:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
26 set 2017 13:35:20
0

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/

7 set 2018 21:42:20
0

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 );
}
18 ott 2020 16:40:40