Ottenere l'excerpt usando get_the_excerpt al di fuori di un loop

24 ago 2011, 02:55:39
Visualizzazioni: 77.9K
Voti: 32

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"

3
Commenti

ok, ho capito usando my_excerpt($post->post_content, get_the_excerpt()) e la funzione my_excerpt() da http://wordpress.stackexchange.com/questions/6961/using-wp-trim-excerpt-to-get-the-excerpt-outside-the-loop

ariel ariel
24 ago 2011 03:44:37

Per favore aggiungi la soluzione che hai trovato come risposta, così questa domanda non rimarrà senza risposta. :)

Rarst Rarst
12 set 2011 00:56:46

Basta usare la funzione the_post() (funziona anche nel template del singolo post) prima di chiamare get_the_excerpt(), imposterà i dati necessari per te.

Sisir Sisir
18 set 2014 19:01:20
Tutte le risposte alla domanda 9
6
32

Ho trovato questa domanda mentre cercavo come farlo senza l'oggetto post.

Le mie ulteriori ricerche hanno portato alla luce questa elegante tecnica:

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

18 giu 2014 18:33:10
Commenti

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.

MacK MacK
16 giu 2015 19:43:21

restituisce una stringa vuota.

Kyaw Tun Kyaw Tun
20 gen 2016 09:45:54

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

random_user_name random_user_name
20 gen 2016 17:03:25

@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 Kyaw Tun
21 gen 2016 14:30:01

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.

Muhammad Asad Muhammad Asad
20 mag 2016 21:42:28

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.

Fabien Snauwaert Fabien Snauwaert
21 mar 2019 00:15:12
Mostra i restanti 1 commenti
2
22

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.

9 giu 2012 02:06:40
Commenti

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

deach deach
20 gen 2017 01:35:47

setup_postdata($post); FTW!!!!

squarecandy squarecandy
30 apr 2017 20:48:28
2
18

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

Ecco un articolo che descrive il codice.

9 giu 2012 02:02:37
Commenti

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.

Imperative Ideas Imperative Ideas
15 mag 2014 05:56:30

La risposta di EAMann è un approccio molto migliore a questo problema e dovrebbe essere considerata la best practice. Questo approccio sostanzialmente duplica gli interni del Core invece di utilizzare l'API.

Ian Dunn Ian Dunn
24 mar 2015 03:18:53
3

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

20 mag 2016 14:07:23
Commenti

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

Matija Mrkaic Matija Mrkaic
13 giu 2016 15:18:58

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

Dylan Dylan
17 ago 2016 01:24:22

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

kraftner kraftner
14 set 2016 10:18:21
2

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

13 set 2011 08:44:24
Commenti

Le risposte che contengono solo link non sono buone. Copia qui il codice rilevante. Quando quel link si rompe, quel sito è offline/sparito, allora questa risposta non ha alcun valore.

random_user_name random_user_name
18 giu 2014 18:23:26

Ha funzionato perfettamente per me!

Saikat Saikat
24 lug 2017 15:19:09
2

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
}
25 nov 2012 21:28:20
Commenti

Ma il richiedente ha un oggetto post come indicato nella domanda.

fuxia fuxia
25 nov 2012 21:51:04

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

Bill Bill
7 nov 2014 14:46:39
1

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;
}
1 ott 2014 02:17:27
Commenti

Questo è il modo più diretto per farlo... Non sono sicuro che sia ottimo in termini di prestazioni però. Comunque hai il mio +1

Bill Bill
7 nov 2014 14:47:23
0

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);
15 mag 2017 21:25:17
1
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
14 mar 2018 18:53:02
Commenti

Per favore [modifica] la tua risposta e aggiungi una spiegazione: perché questa soluzione potrebbe risolvere il problema?

fuxia fuxia
14 mar 2018 22:25:18