OTTIENI il brano per ID


31

Perché non si può ottenere l'estratto per ID come con il titolo e la maggior parte degli altri elementi.

per esempio. get_the_excerpt (ID). So come usarlo con la funzione $ post-> post_excerpt ma che non restituisce parte del contenuto se non è stato inserito alcun estratto, semplicemente non restituisce nulla.

Quindi quello che sto cercando di fare è ottenere l'estratto per ID se c'è un estratto, e se non c'è un estratto con quell'ID ma c'è del contenuto, per ottenere invece un po 'di contenuto.

Come si farebbe.

Qualche idea,

Meravigliosa ...

MODIFICARE --

Codice sorgente 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>



<?php echo $excerpt;?></div>
              <?php endforeach;?>

che cosa sono esattamente "alcuni" dei contenuti?
Kaiser

La funzione di estratto in wordpress restituisce l'estratto di un post. Se il post non ha un estratto restituisce un certo numero di caratteri del contenuto seguito da '...' o 'leggi di più' o qualunque cosa il modello fornisca
Robin I Knight

1
Non essere un PITA ma le regole della comunità non consentono firme e chiusure standard. Per rispettare le regole ed evitare che Jeff Atwood ti invii un messaggio severo dopo aver modificato tutte le tue domande, ti preghiamo di smettere di usare "Marvellous" come chiusura. (E per favore, non sparare al messaggero)
MikeSchinkel,

Risposte:


20

Ciao @Robin I. Knight:

Considero get_the_excerpt()una funzione con un design legacy. Man mano che l'utilizzo di WordPress è cresciuto, ci sono molti casi d'uso più recenti in cui non si adatta, ma dove funzionano le nuove funzioni per ottenere dati diversi. Un esempio è l'uso ormai frequente di una $argsserie di opzioni di funzioni.

Ma è facile da risolvere per le tue esigenze. Ecco una funzione alternativa che puoi usare che puoi mettere ovunque nel functions.phpfile 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 provato ma sono abbastanza sicuro di averlo fatto bene. Se questo non soddisfa le tue esigenze, ti preghiamo di elaborare e forse posso dare altri suggerimenti.


Funziona. Una specie di. Risultati molto strani. Sta sicuramente eseguendo la sua funzione ma i risultati sono strani. Lo sto usando insieme a GET_Posts e per qualche ragione i primi 2 post ricevono sempre lo stesso. Ecco un link e vedrai cosa intendo. Guarda i 4 post sul lato destro. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight

@Robin I Knight: inserisci il codice sorgente del tuo loop come aggiornamento alla tua domanda; è molto difficile eseguire il debug del codice senza vederlo. Probabilmente è anche un plugin che sta causando il problema; prova a disabilitarli uno alla volta.
MikeSchinkel,

Codice sorgente del loop in questione sopra ^^
Robin I Knight

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

@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 plug-in che devi disabilitare; l'hai provato? E probabilmente non vorrai chiamarlo get_the_excerpt_id()perché WordPress potrebbe aggiungere quella funzione in futuro e interrompere il tuo sito. E probabilmente potresti fare a meno della funzione nel tuo loop usando foreach($stories as $story): global $post; $post = $story;invece.
MikeSchinkel,

16

I meccanismi dell'estratto sono estremamente confusi. Non è una risposta precisa alla tua domanda, ma in generale se devi fare in modo che i tag template, specifici di Loop, funzionino con l'array restituito get_posts()puoi emulare Loop in questo modo:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

che dire di wp_reset_query (); ?
Cwd,

1
@cwd se solo l'utilizzo setup_postdata()della query globale non è interessato e solo i dati post devono essere ripristinati.
Rarst

Questa soluzione è molto più pulita che archiviare il post in un'altra variante e richiedere un altro post solo per renderlo globale. +1
Barry Kooij

Grazie @Rarst che mi ha aiutato. Aggiunta di setup_postdata ($ post); risolto i miei problemi
Simon,

8

C'è una nuova funzione dalla 3.3.0: wp_trim_words

Lo sto usando al di fuori del ciclo come segue:

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

Questo non deve essere confuso con wp_trim_excerpt che apparentemente funziona solo all'interno del ciclo, poiché chiama the_content () internamente.


6

Solo per aggiungere alla risposta di Mike Schinkel, che per qualche motivo non avrebbe 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 ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

Suppongo che se lo stai usando al di fuori del ciclo, non dovrebbe interferire con altri setup_postdata in corso.

Saluti


Ho provato la risposta di MikeSchinkel e non ha funzionato per me. L'impostazione dei dati di post ha funzionato. Nel mio caso senza "setup_postdata" la funzione ha restituito il titolo + estratto del post principale.
Turzifer,

2

Sulla base della risposta di @ Maxime, funzionerebbe?

$post = get_post( $id );

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

Mi sembra abbastanza semplice, ma mi chiedo se mi manca qualcosa.


1

Se TUTTI i tuoi post hanno il <!--more-->tag, puoi utilizzare quanto segue con il tuo codice sopra:

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

Naturalmente se hai post che non hanno il <!--more-->tag, verranno mostrati nella loro interezza. Funziona nella mia situazione, ma non per tutti ...


1

Considero get_the_excerpt()una funzione con un design legacy. Man mano che l'utilizzo di WordPress è cresciuto, ci sono molti casi d'uso più recenti in cui non si adatta, ma dove funzionano le nuove funzioni per ottenere dati diversi. Un esempio è l'uso ormai frequente di una $argsserie di opzioni di funzioni.

Ma è facile da risolvere per le tue esigenze. Ecco una funzione alternativa che puoi usare che puoi mettere ovunque nel functions.phpfile 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;
}

Solo per aggiungere alla risposta di Mike Schinkel, che per qualche motivo non avrebbe funzionato per me. Ho dovuto aggiungere la riga setup_postdata per farlo funzionare.


Questo deve wp_reset_post_data()funzionare all'interno del ciclo?
Chris Pink,

Apparentemente (dopo aver girato questa casa in particolare) ora fa parte del nucleo.
Chris Pink,

0

Questa è una piccola riga che uso molto usando wp_trim_words . Mi ritrovo costantemente ad aver bisogno dell'abbreviazione e leggo più funzionalità al di fuori del ciclo. Qualcun altro potrebbe trovarlo utile. Quindi questo è quello che uso per:

  1. Ottieni l'estratto tramite ID POST
  2. Ottieni contenuti post se non è stato impostato alcun estratto,
  3. Imposta la lunghezza della parola dell'Estratto
  4. Scegli il contenuto per ulteriori informazioni (link / testo)

L'ho messo in linea, direttamente nel modello personalizzato che sto modificando.

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

Abbattersi

1.Il contenuto dell'estratto

Ottieni l'estrazione per ID post, ma ottieni il contenuto della pubblicazione se non è stato impostato alcun estratto.

Sto usando la scorciatoia If / Else PHP .

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

2. Lunghezza della parola

Imposta la quantità di parole nell'Estratto su 20

    "20"

3. Scegli contenuto ReadMore (link / testo)

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

Ero solito $dapost->guidottenere l'URL, perché non avevo bisogno di URL amichevoli e volevo evitare un'altra chiamata al DB. Puoi sempre usare get_the_permalink.

Vedi wp_trim_words nella documentazione di Wordpress.


0

Questo ha funzionato per me:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));


-2

Questo è più veloce:

global $post;
return get_post($post_id)->post_excerpt;

1
Non quando l'estratto è vuoto ... come indicato nella domanda.
fuxia

Infatti, non quando viene generata automaticamente
un'eccezione

Sottovalutato poiché questo non è utile
Pieter Goosen l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.