Holen Sie sich den Auszug von ID

31

Warum kann man den ID-Auszug nicht wie beim Titel und den meisten anderen Elementen abrufen?

z.B. get_the_excerpt (ID). Ich weiß, wie man es mit der Funktion $ post-> post_excerpt verwendet, aber das gibt keinen Teil des Inhalts zurück, wenn kein Auszug eingegeben wurde. Es gibt einfach nichts zurück.

Ich versuche also, den Auszug nach ID abzurufen, wenn es einen Auszug gibt, und wenn es keinen Auszug mit dieser ID gibt, aber einige Inhalte, um stattdessen einen Teil des Inhalts abzurufen.

Wie würde man das machen?

Irgendwelche Ideen,

Wunderbar ...

BEARBEITEN -

Loop-Quellcode wie gewünscht.

<?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;?>
Robin ich Ritter
quelle
Was genau ist "ein Teil" des Inhalts?
Kaiser
Die Auszugsfunktion in WordPress gibt den Auszug eines Beitrags zurück. Wenn der Beitrag keinen Auszug enthält, gibt er eine bestimmte Anzahl von Zeichen des Inhalts zurück, gefolgt von '...' oder 'read more' oder was auch immer die Vorlage vorsieht
Robin I Knight
1
Kein PITA zu sein, aber Community-Regeln verbieten Unterschriften und Standardschließungen. Um die Regeln einzuhalten und zu vermeiden, dass Jeff Atwood Ihnen nach der Bearbeitung aller Ihrer Fragen eine strenge Nachricht sendet, verwenden Sie "Marvelous" nicht mehr als Abschluss. (Und bitte nicht den Boten erschießen)
MikeSchinkel

Antworten:

20

Hi @ Robin I. Knight:

Ich betrachte es get_the_excerpt()als eine Funktion mit altem Design. Mit der zunehmenden Nutzung von WordPress gibt es viele neuere Anwendungsfälle, in denen es nicht passt, die neueren Funktionen zum Abrufen anderer Daten jedoch funktionieren. Ein Beispiel ist die mittlerweile häufige Verwendung einer $argsReihe von Funktionsoptionen.

Es lässt sich jedoch leicht auf Ihre Bedürfnisse abstimmen. Hier ist eine alternative Funktion, die Sie verwenden können und die Sie an einer beliebigen Stelle in die functions.phpDatei Ihres Themas einfügen können:

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

Ich habe es nicht getestet, bin mir aber ziemlich sicher, dass ich es richtig gemacht habe. Wenn dies nicht Ihren Bedürfnissen entspricht, arbeiten Sie es bitte aus und vielleicht kann ich andere Vorschläge machen.

MikeSchinkel
quelle
Es klappt. Art von. Sehr seltsame Ergebnisse. Es erfüllt definitiv seine Funktion, aber die Ergebnisse sind seltsam. Ich benutze es in Verbindung mit GET_Posts und aus irgendeinem Grund sind die Top 2 get posts immer gleich. Hier ist ein Link und Sie werden sehen, was ich meine. Schauen Sie sich die 4 Pfosten auf der rechten Seite an. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight
@ Robin I Knight: Bitte posten Sie Ihren Loop-Quellcode als Update für Ihre Frage. Es ist sehr schwer, Code zu debuggen, ohne Code zu sehen. Möglicherweise ist es auch ein Plugin, das das Problem verursacht. versuchen Sie, sie einzeln zu deaktivieren.
MikeSchinkel
Der betreffende Loop-Quellcode oben ^^
Robin I Knight
Übrigens habe ich den Namen der Funktion in get_the_excerpt_id ($ post_id) geändert
Robin I Knight
@Robin I Knight - Ich sehe nichts in Ihrer Schleife, aber Sie könnten versuchen, setup_postdata($post)am Anfang Ihrer Schleife anzurufen, wie @Rarst vorschlägt. Wenn dies nicht funktioniert, müssen Sie möglicherweise ein Plugin deaktivieren. hast du das versucht Und Sie möchten es wahrscheinlich nicht mehr aufrufen, get_the_excerpt_id()da WordPress diese Funktion in Zukunft hinzufügen und Ihre Site beschädigen könnte. Und Sie könnten wahrscheinlich auf die Funktion in Ihrer Schleife verzichten, indem Sie foreach($stories as $story): global $post; $post = $story;stattdessen verwenden.
MikeSchinkel
16

Die Mechanik des Ausschnitts ist äußerst verwirrend. Es ist keine präzise Antwort auf Ihre Frage, aber im Allgemeinen können Sie Loop folgendermaßen get_posts()emulieren, wenn Sie Template-Tags speziell für Loop erstellen und mit dem von Ihnen zurückgegebenen Array arbeiten müssen :

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
Rarst
quelle
was ist mit wp_reset_query (); ?
KWD
1
@cwd, wenn nur die Verwendung setup_postdata()globaler Abfragen nicht betroffen ist und nur Post-Daten zurückgesetzt werden müssen.
Rarst
Diese Lösung ist viel sauberer als das Speichern des Posts in einer anderen Variable und das Anfordern eines anderen Posts, um ihn global zu gestalten. +1
Barry Kooij
Danke @Rarst, das hat mir geholfen. Hinzufügen von setup_postdata ($ post); löste meine Probleme
Simon
8

Seit 3.3.0 gibt es eine neue Funktion: wp_trim_words

Ich benutze es außerhalb der Schleife wie folgt:

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

Dies ist nicht zu verwechseln mit wp_trim_excerpt , das anscheinend nur innerhalb der Schleife funktioniert, da es the_content () intern aufruft.

lkraav
quelle
6

Nur um die Antwort von MikeSchinkel zu ergänzen, die aus irgendeinem Grund für mich nicht funktionieren würde. Ich musste die Zeile setup_postdata hinzufügen, damit es funktioniert.

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;

}

Ich gehe davon aus, dass, wenn Sie dies außerhalb der Schleife verwenden, es andere Setup_post-Daten nicht beeinträchtigen sollte, die weitergehen.

Prost

Dan Brown
quelle
Ich habe MikeSchinkels Antwort ausprobiert und es hat bei mir nicht funktioniert. Das Einrichten von Post-Daten hat den Trick getan. In meinem Fall ohne 'setup_postdata' hat die Funktion den Titel + Auszug des übergeordneten Beitrags zurückgegeben.
Turzifer
2

Aufbauend auf der Antwort von @ Maxime, würde das funktionieren?

$post = get_post( $id );

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

Es scheint mir einfach zu sein, aber ich frage mich, ob mir etwas fehlt.

Dominic P
quelle
1

Wenn ALLE Ihre Beiträge mit dem <!--more-->Tag versehen sind, können Sie mit Ihrem obigen Code Folgendes verwenden:

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

Wenn Sie Beiträge haben, die nicht mit dem <!--more-->Tag versehen sind, werden diese natürlich vollständig angezeigt. Funktioniert in meiner Situation, aber nicht für alle ...

Stephen Cronin
quelle
1

Ich betrachte es get_the_excerpt()als eine Funktion mit altem Design. Mit der zunehmenden Nutzung von WordPress gibt es viele neuere Anwendungsfälle, in denen es nicht passt, die neueren Funktionen zum Abrufen anderer Daten jedoch funktionieren. Ein Beispiel ist die mittlerweile häufige Verwendung einer $argsReihe von Funktionsoptionen.

Es lässt sich jedoch leicht auf Ihre Bedürfnisse abstimmen. Hier ist eine alternative Funktion, die Sie verwenden können und die Sie an einer beliebigen Stelle in die functions.phpDatei Ihres Themas einfügen können:

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

Nur um die Antwort von MikeSchinkel zu ergänzen, die aus irgendeinem Grund für mich nicht funktionieren würde. Ich musste die Zeile setup_postdata hinzufügen, damit es funktioniert.

Jude
quelle
Muss dies wp_reset_post_data()innerhalb der Schleife funktionieren?
Chris Pink
Anscheinend (nach dem Umgehen dieses bestimmten Hauses) ist es jetzt Teil des Kerns.
Chris Pink
0

Dies ist ein kleiner Zweizeiler, den ich häufig mit wp_trim_words benutze . Ich stelle ständig fest, dass ich die Abkürzung brauche und lese mehr Funktionen außerhalb der Schleife. Andere mögen dies nützlich finden. Also das ist, was ich benutze, um:

  1. Holen Sie sich den Auszug per POST ID
  2. Post-Inhalt abrufen Wenn kein Auszug festgelegt wurde,
  3. Legen Sie die Wortlänge des Ausschnitts fest
  4. Wählen Sie den Inhalt für die Read More (Link / Text)

Ich habe dies direkt in die benutzerdefinierte Vorlage eingefügt, die ich gerade bearbeite.

    //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>" );

Nervenzusammenbruch

1. Der auszug inhalt

Den Auszug nach Beitrags-ID abrufen, aber den Beitragsinhalt abrufen, wenn kein Auszug festgelegt wurde.

Ich benutze If / Else PHP-Kurzschrift .

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

2. Wortlänge

Stellen Sie die Anzahl der Wörter im Auszug auf 20 ein

    "20"

3. Wählen Sie ReadMore Content (Link / Text).

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

Früher $dapost->guidhabe ich die URL abgerufen, weil ich keine benutzerfreundlichen URLs benötigte und einen weiteren Aufruf der DB vermeiden wollte. Sie könnten immer get_the_permalink verwenden.

Siehe wp_trim_words in der Wordpress-Dokumentation.

Brev Tiw
quelle
0

Das hat bei mir funktioniert:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
Rijo KP
quelle
-2

Das geht schneller:

global $post;
return get_post($post_id)->post_excerpt;
Maxime Kieffer
quelle
1
Nicht, wenn der Auszug leer ist ... wie in der Frage erwähnt.
fuxia
In der Tat nicht, wenn eine Ausnahme automatisch generiert wird
Joshc
Abgestimmt, da dies nicht nützlich ist
Pieter Goosen