Obține excerpt folosind get_the_excerpt în afara buclei

24 aug. 2011, 02:55:39
Vizualizări: 77.9K
Voturi: 32

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"

3
Comentarii

ok, am înțeles, folosind my_excerpt($post->post_content, get_the_excerpt()) și funcția my_excerpt() de la http://wordpress.stackexchange.com/questions/6961/using-wp-trim-excerpt-to-get-the-excerpt-outside-the-loop

ariel ariel
24 aug. 2011 03:44:37

Te rog adaugă soluția la care ai ajuns ca răspuns, ca să nu rămână această întrebare fără răspuns pe site. :)

Rarst Rarst
12 sept. 2011 00:56:46

Pur și simplu folosește funcția the_post() (funcționează și în template-ul pentru postări individuale) înainte de a apela get_the_excerpt(), aceasta va configura datele necesare pentru tine.

Sisir Sisir
18 sept. 2014 19:01:20
Toate răspunsurile la întrebare 9
6
32

Am găsit această întrebare în timp ce căutam cum să fac asta fără obiectul post.

Cercetările mele suplimentare au scos la iveală această tehnică ingenioasă:

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

18 iun. 2014 18:33:10
Comentarii

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.

MacK MacK
16 iun. 2015 19:43:21

returnează un șir gol.

Kyaw Tun Kyaw Tun
20 ian. 2016 09:45:54

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

random_user_name random_user_name
20 ian. 2016 17:03:25

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

Kyaw Tun Kyaw Tun
21 ian. 2016 14:30:01

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.

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

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.

Fabien Snauwaert Fabien Snauwaert
21 mar. 2019 00:15:12
Arată celelalte 1 comentarii
2
22

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.

9 iun. 2012 02:06:40
Comentarii

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

deach deach
20 ian. 2017 01:35:47

setup_postdata($post); FTW!!!!

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

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

Aici este un articol care descrie codul.

9 iun. 2012 02:02:37
Comentarii

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.

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

Răspunsul lui EAMann este o abordare mult mai bună a acestei probleme și ar trebui considerată cea mai bună practică. Această abordare practic duplică internalele Nucleului în loc să folosească API-ul.

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

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

20 mai 2016 14:07:23
Comentarii

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

Matija Mrkaic Matija Mrkaic
13 iun. 2016 15:18:58

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

Dylan Dylan
17 aug. 2016 01:24:22

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

kraftner kraftner
14 sept. 2016 10:18:21
2

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

13 sept. 2011 08:44:24
Comentarii

Răspunsurile care conțin doar link-uri nu sunt utile. Copiați codul relevant aici. Când acel link este stricat, site-ul este indisponibil/șters, atunci acest răspuns nu mai are nicio valoare.

random_user_name random_user_name
18 iun. 2014 18:23:26

A funcționat perfect pentru mine!

Saikat Saikat
24 iul. 2017 15:19:09
2

În cazul în care nu aveți obiectul post, iată o funcție scurtă similară cu cea din Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
25 nov. 2012 21:28:20
Comentarii

Dar întrebătorul are un obiect post, cum este menționat în întrebare.

fuxia fuxia
25 nov. 2012 21:51:04

Corectează-mă dacă greșesc, această metodă va returna rezumatul manual dar nu va genera unul dacă este necesar

Bill Bill
7 nov. 2014 14:46:39
1

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;
}
1 oct. 2014 02:17:27
Comentarii

Aceasta este cea mai directă metodă de a face acest lucru... Nu sunt sigur că este foarte eficientă din punct de vedere al performanței. Totuși, îți ofer meu +1

Bill Bill
7 nov. 2014 14:47:23
0

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);
15 mai 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
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva problema?

fuxia fuxia
14 mar. 2018 22:25:18