POBIERZ fragment według ID


31

Dlaczego nie można uzyskać fragmentu dokumentu tożsamości, tak jak w przypadku tytułu i większości innych elementów.

na przykład. get_the_excerpt (ID). Wiem, jak używać go z funkcją $ post-> post_excerpt, ale to nie zwraca części treści, jeśli nie wprowadzono żadnego fragmentu, zwykłe nic nie zwraca.

Więc próbuję uzyskać fragment według ID, jeśli istnieje fragment, a jeśli nie ma fragmentu z tym identyfikatorem, ale jest trochę treści, zamiast tego mam trochę zawartości.

Jak by to zrobić.

Jakieś pomysły,

Cudowne ...

EDYTOWAĆ --

Pętla Kod źródłowy zgodnie z żądaniem.

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



<?php echo $excerpt;?></div>
              <?php endforeach;?>

czym dokładnie jest „część” treści?
kaiser

Funkcja fragmentu w wordpress zwraca fragment postu. Jeśli post nie ma fragmentu, zwraca pewną liczbę znaków treści, po których następuje „...” lub „czytaj więcej” lub cokolwiek innego, co zapewnia szablon
Robin I Knight

1
Nie być PITA, ale zasady wspólnotowe zabraniają podpisów i standardowych zamknięć. Aby przestrzegać zasad i uniknąć sytuacji, w której Jeff Atwood wyśle ​​ci surową wiadomość po edycji wszystkich pytań, przestań używać „Cudownego” jako zakończenia. (I proszę, nie strzelaj do posłańca)
MikeSchinkel,

Odpowiedzi:


20

Cześć @Robin I. Knight:

Widzę get_the_excerpt()jako funkcję ze starszym designem. W miarę wzrostu wykorzystania WordPress istnieje wiele nowszych przypadków użycia, w których nie pasuje, ale w których działają nowsze funkcje pobierania różnych danych. Jednym z przykładów jest obecnie częste stosowanie $argstablicy opcji funkcji.

Ale łatwo to naprawić dla twoich potrzeb. Oto alternatywna funkcja, której możesz użyć, którą możesz umieścić w dowolnym miejscu functions.phppliku motywu :

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

Nie przetestowałem tego, ale jestem pewien, że dobrze to zrozumiałem. Jeśli to nie zaspokoi twoich potrzeb, opracuj je, a może dam Ci inne sugestie.


To działa. Raczej. Bardzo dziwne wyniki. Zdecydowanie spełnia swoją funkcję, ale wyniki są dziwne. Używam go w połączeniu z GET_Posts i z jakiegoś powodu 2 najlepsze posty są zawsze takie same. Oto link, a zobaczysz, co mam na myśli. Spójrz na 4 posty po prawej stronie. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight

@Robin I Knight: Prześlij kod źródłowy pętli jako aktualizację pytania; bardzo trudno jest debugować kod bez wyświetlania kodu. Prawdopodobnie jest to wtyczka, która powoduje problem; spróbuj je wyłączyć pojedynczo.
MikeSchinkel

Kod źródłowy pętli, o którym mowa powyżej ^^
Robin I Knight

BTW Zmieniłem nazwę funkcji na get_the_excerpt_id ($ post_id)
Robin I Knight

@Robin I Knight - Nic nie widzę w twojej pętli, ale możesz spróbować zadzwonić setup_postdata($post)na początku swojej pętli, jak sugeruje @Rarst. Jeśli to nie zadziała, może to być wtyczka, którą musisz wyłączyć; próbowałeś tego? I prawdopodobnie nie chcesz tego nazywać, get_the_excerpt_id()ponieważ WordPress mógłby dodać tę funkcję w przyszłości i uszkodzić twoją stronę. I prawdopodobnie mógłbyś obejść się bez funkcji w swojej pętli, używając foreach($stories as $story): global $post; $post = $story;zamiast tego.
MikeSchinkel

16

Mechanika fragmentu jest bardzo myląca. To nie jest dokładna odpowiedź na twoje pytanie, ale ogólnie, jeśli chcesz utworzyć tagi szablonu, specyficzne dla Loop, pracować z zwróconą przez get_posts()ciebie tablicą , możesz emulować Loop w następujący sposób:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

co z wp_reset_query (); ?
cwd 27.01.12

1
@cwd, jeśli setup_postdata()nie dotyczy to tylko globalnego zapytania i należy zresetować tylko dane postu.
Rarst

To rozwiązanie jest dużo czystsze niż przechowywanie posta w innym var i wymaganie innego postu, aby uzyskać go globalnie. +1
Barry Kooij

Dzięki @Rarst, który mi pomógł. Dodanie setup_postdata ($ post); rozwiązałem moje problemy
Simon

8

Pojawiła się nowa funkcja od 3.3.0: wp_trim_words

Używam go poza pętlą w następujący sposób:

 <?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>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

Nie należy tego mylić z wp_trim_excerpt, który najwyraźniej działa tylko w pętli, ponieważ wywołuje wewnętrznie metodę the_content ().


6

Wystarczy dodać do odpowiedzi MikeSchinkela, która z jakiegoś powodu nie działałaby dla mnie. Musiałem dodać wiersz setup_postdata, aby działał.

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

Zakładam, że jeśli używasz tego poza pętlą, nie powinno to kolidować z innymi działającymi danymi setup_postdata.

Twoje zdrowie


Wypróbowałem odpowiedź MikeSchinkela i nie zadziałało to dla mnie. Konfiguracja danych pocztowych załatwiła sprawę. W moim przypadku bez „setup_postdata” funkcja zwróciła tytuł + fragment postu nadrzędnego.
turzifer

2

Opierając się na odpowiedzi @ Maxime, czy to zadziała?

$post = get_post( $id );

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

Wydaje mi się to dość proste, ale zastanawiam się, czy coś mi umknęło.


1

Jeśli WSZYSTKIE Twoje posty mają <!--more-->tag, możesz użyć następującego kodu z powyższym kodem:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

Oczywiście, jeśli masz jakieś posty, które nie mają tego <!--more-->tagu, zostaną one wyświetlone w całości. Działa w mojej sytuacji, ale nie dla wszystkich ...


1

Widzę get_the_excerpt()jako funkcję ze starszym designem. W miarę wzrostu wykorzystania WordPress istnieje wiele nowszych przypadków użycia, w których nie pasuje, ale w których działają nowsze funkcje pobierania różnych danych. Jednym z przykładów jest obecnie częste stosowanie an$argstablicy opcji funkcji.

Ale łatwo to naprawić dla twoich potrzeb. Oto alternatywna funkcja, której możesz użyć, którą możesz umieścić w dowolnym miejscu functions.phppliku motywu :

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

Wystarczy dodać do odpowiedzi MikeSchinkela, która z jakiegoś powodu nie działałaby dla mnie. Musiałem dodać wiersz setup_postdata, aby działał.


Czy to musi wp_reset_post_data()działać wewnątrz pętli?
Chris Pink

Najwyraźniej (po obejściu tego konkretnego domu) jest teraz częścią rdzenia.
Chris Pink

0

To jest trochę dwuliniowy, którego używam dużo, wykorzystując wp_trim_words . Ciągle potrzebuję skrótu i ​​czytam więcej funkcjonalności poza pętlą. Ktoś inny może uznać to za przydatne. Więc tego używam do:

  1. Uzyskaj fragment według identyfikatora POST
  2. Pobierz treść postu Jeśli nie ustawiono fragmentu,
  3. Ustaw długość słowa fragmentu
  4. Wybierz treść do przeczytania więcej (link / tekst)

Wstawiam to bezpośrednio do niestandardowego szablonu, który edytuję.

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $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'> ".__('Get More Stuff', 'translation')."</a>" );

Awaria

1. Treść fragmentu

Uzyskaj fragment według identyfikatora postu, ale uzyskaj treść postu, jeśli żaden fragment nie został ustawiony.

Używam skróconej instrukcji If / Else PHP .

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2. Długość słowa

Ustaw liczbę słów we fragmencie na 20

    "20"

3. Wybierz ReadMore Content (link / tekst)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

Kiedyś $dapost->guiddostawałem adres URL, ponieważ nie potrzebowałem przyjaznych adresów URL i chciałem uniknąć kolejnego połączenia z bazą danych. Zawsze możesz użyć get_the_permalink.

Zobacz wp_trim_words w dokumentacji Wordpress.


0

To działało dla mnie:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));


-2

Jest to szybsze:

global $post;
return get_post($post_id)->post_excerpt;

1
Nie, gdy fragment jest pusty… jak wspomniano w pytaniu.
fuxia

Rzeczywiście nie, gdy wyjątek jest generowany automatycznie
Joshc

Zagłosowano, ponieważ nie jest to przydatne
Pieter Goosen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.