Obțineți rezumatul după ID

19 mar. 2011, 19:34:36
Vizualizări: 95.1K
Voturi: 34

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>
3
Comentarii

ce anume înseamnă "o parte" din conținut?

kaiser kaiser
19 mar. 2011 19:47:10

Funcția excerpt în WordPress returnează fragmentul unui articol. Dacă articolul nu are un fragment definit, returnează un anumit număr de caractere din conținut, urmate de '...' sau 'citește mai mult' sau orice altceva este prevăzut în șablon

Robin I Knight Robin I Knight
19 mar. 2011 19:48:28

Nu vreau să fiu dificil, dar regulile comunității interdic semnăturile și încheierile standard. Pentru a respecta regulile și a evita ca Jeff Atwood să vă trimită un mesaj sever după editarea tuturor întrebărilor, vă rog să încetați să folosiți "Marvelos" ca încheiere. (Și vă rog să nu împușcați mesagerul)

MikeSchinkel MikeSchinkel
19 mar. 2011 20:26:46
Toate răspunsurile la întrebare 11
5
21

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.

19 mar. 2011 20:33:57
Comentarii

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 Robin I Knight
19 mar. 2011 21:48:36

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

MikeSchinkel MikeSchinkel
19 mar. 2011 22:19:32

Codul sursă al buclei este în întrebarea de mai sus ^^

Robin I Knight Robin I Knight
19 mar. 2011 22:28:42

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

Robin I Knight Robin I Knight
20 mar. 2011 17:11:52

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

MikeSchinkel MikeSchinkel
20 mar. 2011 21:54:25
4
16

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();
20 mar. 2011 16:12:27
Comentarii

dar despre wp_reset_query(); ?

cwd cwd
27 ian. 2012 18:39:36

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

Rarst Rarst
27 ian. 2012 20:47:39

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

Barry Kooij Barry Kooij
10 apr. 2013 19:02:14

Mulțumesc @Rarst, asta m-a ajutat. Adăugarea setup_postdata($post); a rezolvat problemele mele

Simon Simon
14 nov. 2014 22:55:18
0

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

15 ian. 2012 00:43:37
1

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

30 aug. 2013 12:57:42
Comentarii

Am încercat răspunsul lui MikeSchinkel și nu a funcționat pentru mine. Configurarea datelor postării a funcționat. În cazul meu, fără 'setup_postdata', funcția returna titlul + rezumatul postării părinte.

turzifer turzifer
25 sept. 2016 12:49:32
0

Bazându-se pe răspunsul lui @Maxime, acest lucru ar funcționa?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

Pare destul de simplu pentru mine, dar mă întreb dacă nu cumva omit ceva.

3 mai 2013 00:53:04
0

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

11 iul. 2011 16:01:45
2

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.

19 apr. 2016 15:51:27
Comentarii

Este nevoie de wp_reset_post_data() pentru a funcționa în interiorul buclei?

Chris Pink Chris Pink
10 iul. 2017 12:26:14

Se pare că (după ce am înconjurat această casă) acum face parte din nucleu.

Chris Pink Chris Pink
10 iul. 2017 12:29:07
0

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:

  1. Obțin rezumatul (excerpt) după ID-ul postării
  2. Obțin conținutul postării dacă nu există un rezumat setat
  3. Stabilesc lungimea rezumatului în cuvinte
  4. 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.

8 iun. 2016 07:31:41
0

Aceasta a funcționat pentru mine:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
26 sept. 2017 13:35:20
0

Î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/

7 sept. 2018 21:42:20
0

Oricât de enervant ar putea fi, este de fapt destul de simplu de realizat

function cameronjonesweb_get_excerpt_by_id( $post_id ) {
    return apply_filters( 'get_the_excerpt', wp_trim_excerpt( '', $post_id ), $post_id );
}
18 oct. 2020 16:40:40