Ottieni un estratto usando get_the_excerpt al di fuori di un ciclo


31

Ho un codice che chiama get_the_title()e funziona, ma get_the_excerpt()torna vuoto. Come posso farlo funzionare?

Questo codice si trova all'interno di un plug-in chiamato "Protocollo WP Facebook Open Graph". Ecco la parte che voglio cambiare:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Qui, has_excerptfallisci sempre e get_the_excerpt($post->ID)non funzionano più (deprecato).

Quindi, come posso visualizzare un estratto lì?

ps: sto usando anche il plugin "Advanced Excerpt"


ok, ce l'ho fatta usando my_excerpt($post->post_content, get_the_excerpt())e usando la my_excerpt()funzione di wordpress.stackexchange.com/questions/6961/…
ariel

3
Aggiungi la soluzione che hai trovato come risposta, in modo che questo non perseguiti il ​​sito come una domanda senza risposta. :)
Rarst

Basta usare la funzione the_post()(funziona anche sul modello a post singolo) prima di chiamarla get_the_excerpt()per impostare i dati necessari per te.
Sisir,

Risposte:


29

Ho trovato questa domanda guardando come fare senza l'oggetto post.

La mia ricerca aggiuntiva ha rivelato questa tecnica slick:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));


1
Questo dovrebbe essere accettato come risposta in quanto è il modo consigliato per estrarre i dati al di fuori del ciclo. Inoltre non richiede alcuna funzione personalizzata o sostituzione della $postvariabile globale.
MacK,

4
restituisce una stringa vuota.
Kyaw Tun,

1
@KyawTun: funziona, purché $post_idimpostato (qual è il valore di $post_id? AND $post_idè un ID post valido e legittimo.
cale_b

2
@cale_b Grazie. Uso la query get_posts e ottengo l'ID dall'array risultante. L'oggetto post ha post_title, post_content, ID, ecc. Ma non funziona.
Kyaw Tun,

Se hai bisogno SOLO del TESTO e non del tag <p> incluso nel filtro_excerpt, usa il filtro "get_the_excerpt", in modo che il filtro sopra diventi: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); questo ti darà solo il testo RAW che puoi inserire ovunque nel tuo markup.
Mohsin,

22

Dal momento che sembra che tu abbia già l'oggetto postale per il quale hai bisogno il brano, puoi semplicemente forzare le cose a funzionare:

setup_postdata( $post );
$excerpt = get_the_excerpt();

La setup_postdata()funzione globalizzerà l' $postoggetto e lo renderà disponibile per la normale funzione loop precedente. Quando sei all'interno del loop, chiami the_post()e ti prepara le cose ... al di fuori del loop devi forzarlo manualmente.


1
Funziona ma: "Devi passare un riferimento alla $postvariabile globale , altrimenti funzioni come the_title()non funzionano correttamente". global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
decida il

setup_postdata($post);FTW !!!!
squarecandy

18

Prova questo:

Crea una nuova funzione in Functions.php e chiamala da qualsiasi luogo.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Ecco un post che descrive il codice.


1
Eccellente trovare amico mio. Non ho mai capito perché WordPress avrebbe deprecato una funzione così critica. Questo lo sta effettivamente ricostruendo da zero, ma funziona. Data la frequenza con cui usiamo l'estratto del ciclo con funzionalità come i plug-in di social sharing, probabilmente avrebbe dovuto rimanere una parte del nucleo.
Idee imperative,

1
La risposta di EAMann è un approccio molto migliore a questo problema e dovrebbe essere considerata la migliore pratica. Questo approccio fondamentalmente duplica gli interni di Core invece di utilizzare l'API.
Ian Dunn,



1

Nel caso in cui non si disponga dell'oggetto post, ecco una breve funzione come quella di Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}

Ma il richiedente ha un oggetto postale come indicato nella domanda.
fuxia

3
Correggimi se sbaglio, questo metodo restituirà l'estratto manuale ma non ne genererà uno se necessario
Bill

1

Questo è per quando si desidera utilizzare get_the_excerpt()al di fuori del ciclo:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}

Questo è il modo più diretto per farlo. Non sono sicuro che sia grandioso dal punto di vista delle prestazioni. Ricevi ancora il mio +1
Bill

1

Se desideri generare automaticamente l'estratto dal contenuto in una riga, puoi utilizzare la wp_trim_wordsfunzione in questo modo:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

Si prega di modificare la risposta , e aggiungere una spiegazione: perché potrebbe che risolvere il problema?
fuxia
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.