Ottenere l'excerpt usando get_the_excerpt al di fuori di un loop
Ho un codice che chiama get_the_title()
e funziona, ma get_the_excerpt()
ritorna vuoto. Come posso farlo funzionare?
Questo codice si trova all'interno di un plugin chiamato "WP Facebook Open Graph protocol". Ecco la parte che voglio modificare:
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_excerpt
fallisce sempre e get_the_excerpt($post->ID)
non funziona più (deprecato).
Quindi, come posso visualizzare l'excerpt in quel punto?
PS: Sto usando anche il plugin "Advanced Excerpt"
Questo dovrebbe essere accettato come risposta perché è il modo consigliato per recuperare i dati al di fuori del loop. Inoltre non richiede alcuna funzione personalizzata o sovrascrittura della variabile globale $post
.

@KyawTun - funziona, purché $post_id
sia impostato (qual è il valore di $post_id
?) E $post_id
sia un ID post valido e legittimo.

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

Se ti serve SOLO il TESTO e non il tag <p> che viene incluso con il filtro the_excerpt, allora usa il filtro "get_the_excerpt", così che il filtro sopra diventi: $text = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post_id)); questo ti darà solo il testo GREZZO che puoi inserire ovunque nel tuo markup.

Non funziona neanche per me. Ricorda: "l'excerpt del post. Questo può essere un excerpt fornito dall'utente, che viene restituito invariato, oppure una versione automaticamente generata e ridotta del contenuto completo del post basata sul conteggio delle parole." Forse funziona per quello fornito dall'utente? Io cercavo l'excerpt generato automaticamente.

Poiché sembra che tu abbia già l'oggetto del post per cui ti serve l'estratto, puoi forzare il funzionamento:
setup_postdata( $post );
$excerpt = get_the_excerpt();
La funzione setup_postdata()
renderà globale l'oggetto $post
e lo renderà disponibile per le normali funzioni del loop. Quando sei all'interno del loop, chiami the_post()
e questo imposta tutto automaticamente... al di fuori del loop devi forzarlo manualmente.

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

Prova questo:
Crea una nuova funzione in functions.php e poi chiamala da dove vuoi.
function get_excerpt_by_id($post_id){
$the_post = get_post($post_id); //Ottiene l'ID del post
$the_excerpt = $the_post->post_content; //Ottiene il post_content da usare come base per l'excerpt
$excerpt_length = 35; //Imposta la lunghezza dell'excerpt in numero di parole
$the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Rimuove tag e immagini
$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;
}

Ottima scoperta, amico mio. Non ho mai capito perché WordPress avrebbe deprecato una funzione così critica. In pratica la stai ricostruendo da zero, ma funziona. Considerando quanto spesso usiamo l'estratto al di fuori del loop con funzionalità come i plugin per la condivisione sociale, probabilmente avrebbe dovuto rimanere parte del core.

Ora puoi semplicemente utilizzare la funzione get_the_excerpt( $postID )
.
Dalla versione: WordPress 4.5.0 ha introdotto il parametro $post
.

Questa dovrebbe essere la nuova risposta accettata dato che siamo nell'era di WP 4.5+.

Questo non funzionerà se l'excerpt è vuoto poiché il filtro wp_trim_excerpt
restituirà l'excerpt per il post corrente.

Vedi https://core.trac.wordpress.org/ticket/36934 per i dettagli su quanto detto da @Dylan

ho risolto usando my_excerpt($post->post_content, get_the_excerpt())
e la funzione my_excerpt()
da Usare wp_trim_excerpt per ottenere the_excerpt() al di fuori del loop

Nel caso in cui non si disponga dell'oggetto post, ecco una breve funzione simile a quella di Withers.
function get_excerpt_by_id($post_id){
$the_post = get_post($post_id); // Ottiene il post tramite ID
$the_excerpt = $the_post->post_excerpt; // Recupera l'excerpt del post
return $the_excerpt; // Restituisce l'excerpt
}

Questo è utile quando vuoi utilizzare get_the_excerpt()
al di fuori del loop:
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;
}

Se vuoi generare automaticamente l'estratto dal contenuto in una sola riga - puoi usare la funzione wp_trim_words
in questo modo:
// 30 è il numero di parole qui
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
