Obțineți rezumatul după ID
De ce nu se poate obține rezumatul după ID, așa cum se poate face cu titlul și celelalte elemente?
De exemplu: get_the_excerpt(ID). Știu cum să folosesc funcția $post->post_excerpt, dar aceasta nu returnează o parte din conținut dacă nu există rezumat introdus, ci pur și simplu nu returnează nimic.
Ce încerc să fac este să obțin rezumatul după ID dacă există un rezumat, iar dacă nu există un rezumat pentru acel ID dar există conținut, să obțin o parte din conținut în schimb.
Cum aș putea face asta?
Idei?
Marvelos...
EDIT --
Codul sursă al buclei la cerere.
<?php $stories = get_posts('category_name=feedback&numberposts=4');
foreach ($stories as $post) :
$title = $post->post_title;
$excerpt = get_the_excerpt_id($post->ID);
$thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
<div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
</div>
</div>
<script type="text/javascript">
var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
$('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);
</script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>
Salut @Robin I. Knight:
Eu consider funcția get_the_excerpt()
ca având un design învechit. Pe măsură ce utilizarea WordPress a crescut, există multe cazuri de utilizare noi unde aceasta nu se potrivește, dar unde noile funcții pentru obținerea diferitelor date se potrivesc. Un exemplu este folosirea frecventă acum a unui array $args
cu opțiuni pentru funcții.
Dar este ușor de rezolvat pentru nevoile tale. Iată o funcție alternativă pe care o poți folosi și pe care o poți pune oriunde în fișierul functions.php
al temei tale:
function robins_get_the_excerpt($post_id) {
global $post;
$save_post = $post;
$post = get_post($post_id);
$output = get_the_excerpt();
$post = $save_post;
return $output;
}
Nu am testat-o, dar sunt destul de sigur că am făcut-o corect. Dacă această soluție nu îți satisface nevoile, te rog să detaliezi și poate pot face alte sugestii.

Funcționează. Oarecum. Rezultate foarte ciudate. Cu siguranță își face treaba, dar rezultatele sunt ciudate. Îl folosesc împreună cu GET_Posts și din nu știu ce motiv, primele 2 postări sunt întotdeauna aceleași. Iată un link și vei înțelege la ce mă refer. Uită-te la cele 4 postări din partea dreaptă. http://www.divethegap.com/update/community/feedback/2010/06/steve-riches/

@Robin I Knight: Te rog să postezi codul sursă al buclei tale ca o actualizare la întrebarea ta; este foarte greu să depanezi codul fără să-l vezi. De asemenea, poate fi vorba despre un plugin care cauzează problema; încearcă să le dezactivezi pe rând.

Apropo, am schimbat numele funcției în get_the_excerpt_id($post_id)

@Robin I Knight - Nu văd nimic în bucla ta, dar ai putea încerca să apelezi setup_postdata($post)
la începutul buclei tale, așa cum sugerează @Rarst. Dacă nu funcționează, ar putea fi un plugin pe care trebuie să îl dezactivezi; ai încercat asta? Și probabil nu vrei să o numești get_the_excerpt_id()
pentru că WordPress ar putea adăuga acea funcție în viitor și ar putea strica site-ul tău. Și probabil ai putea să te descurci fără funcția în bucla ta folosind foreach($stories as $story): global $post; $post = $story;
în schimb.

Mecanica funcționării fragmentelor (excerpt) este extrem de confuză. Nu este un răspuns precis la întrebarea ta, dar în general, dacă ai nevoie să faci ca tag-urile de șablon, specifice Loop-ului, să funcționeze cu un array returnat de get_posts()
, poți emula Loop-ul astfel:
$stories = get_posts();
foreach ($stories as $post) {
setup_postdata($post);
// conținut
}
wp_reset_postdata();

@cwd dacă folosești doar setup_postdata()
, interogarea globală nu este afectată și trebuie resetate doar datele postării.

Această soluție este mult mai curată decât stocarea postării într-o altă variabilă și reinterogarea unui alt post doar pentru a-l face global. +1

Există o nouă funcție începând cu versiunea 3.3.0: wp_trim_words
O folosesc în afara loop-ului astfel:
<?php if ( $post_id ) {
$post = get_post( $post_id );
if ( $post ) { ?>
<h2><?php echo $post->post_title; ?></h2>
<p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
<p><strong>Acest articol poate fi citit doar de abonați.</strong></p>
<?php } } ?>
Aceasta nu trebuie confundată cu wp_trim_excerpt care aparent funcționează doar în cadrul loop-ului, deoarece apelează intern the_content().

Doar pentru a adăuga la răspunsul lui MikeSchinkel, care din nu știu ce motiv nu a funcționat pentru mine. A trebuit să adaug linia setup_postdata pentru a face să funcționeze.
function get_the_excerpt( $post_id ){
global $post;
$save_post = $post;
$post = get_post($post_id);
setup_postdata( $post ); // salut
$output = get_the_excerpt();
$post = $save_post;
return $output;
}
Presupun că dacă folosești această funcție în afara loop-ului, atunci nu ar trebui să interfereze cu alte setup_postdata care rulează.
Noroc

Dacă TUTUROR articolelor tale li s-a adăugat tag-ul <!--more-->
, atunci poți folosi următoarea soluție împreună cu codul de mai sus:
$sjc_excerpt = explode( '<!--more-->', $post->post_content);
echo wpautop( $sjc_excerpt[0] );
Desigur, dacă ai orice articole care nu conțin tag-ul <!--more-->
, acestea vor fi afișate în întregime. Funcționează în situația mea, dar nu pentru toate...

Consider funcția get_the_excerpt()
ca fiind una cu un design învechit. Pe măsură ce utilizarea WordPress a crescut, există numeroase cazuri de utilizare moderne unde această funcție nu se potrivește, în timp ce funcțiile mai noi pentru obținerea diferitor date o fac. Un exemplu este utilizarea frecventă a unui array $args
pentru opțiunile funcției.
Dar este ușor de adaptat pentru nevoile tale. Iată o funcție alternativă pe care o poți utiliza și pe care o poți adăuga oriunde în fișierul functions.php
al temei tale:
function robins_get_the_excerpt($post_id) {
global $post;
$save_post = $post;
$post = get_post($post_id);
$output = get_the_excerpt();
$post = $save_post;
return $output;
}
Doar pentru a completa răspunsul lui MikeSchinkel, care din anumite motive nu a funcționat pentru mine. A trebuit să adaug linia setup_postdata
pentru a face funcția să funcționeze.

Acesta este un mic fragment de cod pe care îl folosesc frecvent, utilizând funcția wp_trim_words. Mă trezesc adesea nevoit să folosesc funcționalitățile de abreviere și "citește mai mult" în afara buclei. Poate fi util și pentru alții. Iată ce fac cu acest cod:
- Obțin rezumatul (excerpt) după ID-ul postării
- Obțin conținutul postării dacă nu există un rezumat setat
- Stabilesc lungimea rezumatului în cuvinte
- Aleg conținutul pentru link-ul/textul "Citește mai mult"
Plasez acest cod direct în șablonul personalizat pe care îl editez.
// Obține obiectul postării
$dapost = get_post(POST_ID);
// Obține rezumatul
$my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content ), "20", "<a href='$dapost->guid'> ".__('Află mai multe', 'translation')."</a>" );
Explicație detaliată
1. Conținutul rezumatului
Obține rezumatul după ID-ul postării, dar folosește conținutul postării dacă nu există un rezumat setat.
Folosesc sintaxa scurtă if/else din PHP.
$dapost = get_post(POST_ID);
apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content
2. Lungimea în cuvinte
Stabilește numărul de cuvinte din rezumat la 20
"20"
3. Alegere conținut "Citește mai mult" (Link/Text)
"<a href='$dapost->guid'> ".__('Află mai multe', 'translation')."</a>"
Am folosit $dapost->guid
pentru a obține URL-ul, deoarece nu aveam nevoie de URL-uri prietenoase și voiam să evit o altă interogare la baza de date. Puteți folosi și get_the_permalink.
Consultați documentația WordPress pentru wp_trim_words.

Începând cu WP 4.5.0 este posibil să folosiți ID-ul postului ca parametru
get_the_excerpt( $post->ID )
Sursa:https://developer.wordpress.org/reference/functions/get_the_excerpt/
