Obține excerpt folosind get_the_excerpt în afara buclei
Am un cod care apelează get_the_title()
și funcționează, dar get_the_excerpt()
returnează gol. Cum pot să-l fac să funcționeze?
Acest cod se află într-un plugin numit "WP Facebook Open Graph protocol". Iată partea pe care vreau să o modific:
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";
}
Aici, has_excerpt
eșuează întotdeauna, iar get_the_excerpt($post->ID)
nu mai funcționează (este depreciat).
Deci, cum pot afișa excerpt-ul acolo?
ps: Folosesc de asemenea plugin-ul "Advanced Excerpt"
Acesta ar trebui acceptat ca răspuns, deoarece este metoda recomandată pentru a extrage date în afara buclei. De asemenea, nu necesită nicio funcție personalizată sau suprascriere a variabilei globale $post
.

@KyawTun - funcționează, atâta timp cât $post_id
este setat (care este valoarea lui $post_id
?) ȘI $post_id
este un ID de postare valid și legitim.

@cale_b Mulțumesc. Folosesc o interogare get_posts și obțin ID-ul din array-ul rezultat. Obiectul post are post_title, post_content, ID, etc. Dar nu funcționează.

Dacă ai nevoie DOAR de TEXT și nu de tag-ul <p> care este inclus cu filtrul the_excerpt, atunci folosește filtrul "get_the_excerpt", astfel încât filtrul de mai sus devine: $text = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post_id)); Aceasta îți va oferi doar TEXTUL brut pe care îl poți insera oriunde în propriul tău markup.

Nici pentru mine nu funcționează. Reține: "fragmentul postării. Acesta este fie un fragment furnizat de utilizator, care este returnat neschimbat, fie o versiune generată automat și trunchiată pe baza numărului de cuvinte din întregul conținut al postării." S-ar putea să funcționeze pentru cel furnizat de utilizator? Eu căutam fragmentul generat automat.

Deoarece se pare că deja ai obiectul post pentru care ai nevoie de rezumat, poți forța lucrurile să funcționeze:
setup_postdata( $post );
$excerpt = get_the_excerpt();
Funcția setup_postdata()
va globaliza obiectul $post
și îl va face disponibil pentru funcțiile obișnuite din buclă. Când ești în interiorul buclei, apelezi the_post()
și aceasta configurează lucrurile pentru tine... în afara buclei, trebuie să le configurezi manual.

Funcționează, dar: "Trebuie să transmiți o referință către variabila globală $post
, altfel funcții precum the_title()
nu vor funcționa corect."
global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();

Încearcă asta:
Creează o nouă funcție în functions.php și apelează-o de unde ai nevoie.
function get_excerpt_by_id($post_id){
$the_post = get_post($post_id); //Obține ID-ul postării
$the_excerpt = $the_post->post_content; //Obține conținutul postării pentru a fi folosit ca bază pentru rezumat
$excerpt_length = 35; //Setează lungimea rezumatului după numărul de cuvinte
$the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Elimină tagurile și imaginile
$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;
}

Excelentă descoperire, prietene. Nu am înțeles niciodată de ce WordPress ar fi depreciat o astfel de funcție critică. Aceasta practic o reconstruiește de la zero, dar funcționează. Având în vedere cât de des folosim fragmentul în afara buclei cu funcții precum plugin-urile de partajare socială, probabil ar fi trebuit să rămână parte din nucleu.

Acum poți folosi simplu funcția get_the_excerpt( $postID )
.
Începând cu WordPress 4.5.0 a fost introdus parametrul $post
.

Acesta ar trebui să fie noul răspuns acceptat, deoarece suntem în era WP 4.5+.

Aceasta nu va funcționa dacă rezumatul este gol, deoarece filtrul wp_trim_excerpt
va returna rezumatul pentru postarea curentă.

Vezi https://core.trac.wordpress.org/ticket/36934 pentru detalii despre ceea ce a spus @Dylan

am obținut folosind my_excerpt($post->post_content, get_the_excerpt())
și funcția my_excerpt()
din Folosirea wp_trim_excerpt pentru a obține the_excerpt() în afara buclei

Aceasta este pentru când doriți să utilizați get_the_excerpt()
în afara loop-ului:
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;
}

Dacă dorești să generezi automat rezumatul din conținut într-o singură linie - poți folosi funcția wp_trim_words
astfel:
// 30 reprezintă numărul de cuvinte aici
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
