Verwenden Sie wp_trim_excerpt, um the_excerpt () außerhalb der Schleife abzurufen

Ich baue ein Thema, das Auszüge auf der Homepage für potentiell Dutzende von Posts zeigen wird. Ich habe keine manuellen Auszüge für alle meine Posts, daher ist $post->post_excerpt für viele Posts leer. Für den Fall, dass es keinen manuellen Auszug gibt, möchte ich die eingebaute function get_the_excerpt () verwenden, die jedoch außerhalb der Schleife nicht verfügbar ist.

Beim Aufspüren der function sieht es so aus, als ob sie wp_trim_excerpt von wp-includes / format.php verwendet, um Ausschnitte im laufenden Betrieb zu erstellen. Ich wp_trim_excerpt( $item->post_content ) es in meinem Code wie wp_trim_excerpt( $item->post_content ) , aber es gibt einfach den vollen Inhalt zurück. Mache ich etwas falsch?

Ich weiß, dass ich meine eigene function erstellen kann, um einen Auszug zu erstellen, aber ich mag es, wenn möglich, eingebaute functionen zu verwenden und meinen Code mit anderen potentiellen Plugins / Filtern kompatibel zu halten.

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php

Solutions Collecting From Web of "Verwenden Sie wp_trim_excerpt, um the_excerpt () außerhalb der Schleife abzurufen"

Seit WP 3.3.0 ist wp_trim_words() hilfreich, wenn Sie den Inhalt wp_trim_words() können, für den Sie einen Auszug generieren möchten. Ich hoffe, das ist hilfreich für jemanden und es spart die Erstellung Ihrer eigenen Word-Counting-function.

http://codex.wordpress.org/functionsReferenz/wp_trim_words

wp_trim_excerpt() hat ein wenig kuriose Mechanik – wenn etwas an es weitergegeben wird, dann tut es nichts.

Hier ist die grundlegende Logik dahinter:

  • get_the_excerpt() prüft auf manuellen Auszug;
  • wp_trim_excerpt() wenn es keinen manuellen Auszug gibt und macht einen aus Inhalt oder Teaser.

Beide sind eng an globale Variablen und damit an Loop gebunden.

Außerhalb der Schleife ist es besser, Code aus wp_trim_excerpt() und eine eigene Trim-function zu schreiben.

Aktualisieren:

Hier ist eine Ableitung von wp_trim_excerpt (), die ich verwendet habe. functioniert perfekt. Abgeleitet von WordPress Version 3.0.4

 function my_excerpt($text, $excerpt) { if ($excerpt) return $excerpt; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); } 

Hier ist mein Beispiel für einen “trim_excerpt”, der das Post-Objekt oder eine Post-ID als Parameter verwendet.

Offensichtlich basierend auf dem, was im core ist. Ich weiß nicht, warum dies (und get_the_author ()) keine Nicht-Loop-Entsprechungen hat.

 /** * Generates an excerpt from the content, if needed. * * @param int|object $post_or_id can be the post ID, or the actual $post object itself * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it * @return string the snipped excerpt or the manual excerpt if it exists */ function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') { if ( is_object( $post_or_id ) ) $postObj = $post_or_id; else $postObj = get_post($post_or_id); $raw_excerpt = $text = $postObj->post_excerpt; if ( '' == $text ) { $text = $postObj->post_content; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); // don't automatically assume we will be using the global "read more" link provided by the theme // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); } 

+1 zu Rast. Es ist sehr seltsam, dass es so etwas wie get_the_excerpt ($ post-> ID) nicht gibt, wenn es ziemlich offensichtlich sein sollte, dass es sollte. Wie auch immer, hier ist wp_trim_excerpt () in WordPress Version 3.0.4:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

 function wp_trim_excerpt($text) { 1824 $raw_excerpt = $text; 1825 if ( '' == $text ) { 1826 $text = get_the_content(''); 1827 1828 $text = strip_shortcodes( $text ); 1829 1830 $text = apply_filters('the_content', $text); 1831 $text = str_replace(']]>', ']]>', $text); 1832 $text = strip_tags($text); 1833 $excerpt_length = apply_filters('excerpt_length', 55); 1834 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); 1835 $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); 1836 if ( count($words) > $excerpt_length ) { 1837 array_pop($words); 1838 $text = implode(' ', $words); 1839 $text = $text . $excerpt_more; 1840 } else { 1841 $text = implode(' ', $words); 1842 } 1843 } 1844 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); 1845 } 

Sie können in Zeile 1826 sehen, dass es über get_the_contents mit der globalen Variablen $ post verbunden ist. Und ja, ich habe keine Ahnung, was sie dachten. Aber von hier, ersetzen Sie den get_the_content durch $ text in Ihrem eigenen my_excerpt, und es sollte sich in ähnlicher Weise verhalten.

Die function get_the_content () würde den vollständigen Inhalt zurückgeben, wenn $ more! = 0 ist. Sie müssen die globale Variable $ more auf 0 setzen, um sicherzustellen, dass die function get_the_content () den Auszug zurückgibt.

Modifizierte wp_trim_excerpt () function:

 function wp_trim_excerpt($text) { $raw_excerpt = $text; if ( '' == $text ) { global $more; $tmp = $more; $more = 0; $text = get_the_content(''); $more = $tmp; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); } 

Unter Verwendung der obigen Antworten ist hier eine einfachere Antwort, die gut zu funktionieren scheint:

 global $post; $excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID)); if ( $excerpt == '' ) { $excerpt = wp_trim_words( $post->post_content, 55 ); } 

Ich verwende es in den -Tags in einer function, um OpenGraph-Beschreibungen zu definieren. Also füge ich einfach hinzu: