it-swarm.com.de

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

Ich erstelle ein Thema, das für potenziell Dutzende von Posts Auszüge auf der Homepage zeigt. Ich habe keine manuellen Auszüge für alle meine Beiträge, daher ist $post->post_excerpt für viele Beiträge leer. Für den Fall, dass es keinen manuellen Auszug gibt, würde ich gerne die integrierte Funktion get_the_excerpt () verwenden, die jedoch außerhalb der Schleife nicht verfügbar ist.

Wenn man die Funktion aufspürt, sieht es so aus, als würde sie wp_trim_excerpt aus wp-includes/formatting.php verwenden, um spontan Ausschnitte zu erstellen. Ich rufe es in meinem Code wie wp_trim_excerpt( $item->post_content ) auf, aber es gibt einfach den vollständigen Inhalt zurück. Mache ich etwas falsch?

Ich weiß, dass ich meine eigene Funktion erstellen kann, um einen Auszug zu erstellen, aber ich verwende, wo immer möglich, integrierte Funktionen, um meinen Code mit anderen potenziellen Plugins/Filtern kompatibel zu halten.

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

20
Derek Perkins

Seit WP 3.3.0 ist wp_trim_words() hilfreich, wenn Sie den Inhalt abrufen können, für den Sie einen Auszug erstellen möchten. Ich hoffe, das ist hilfreich für jemanden und erspart Ihnen das Erstellen Ihrer eigenen Word-Zählfunktion.

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

21
jamesc

wp_trim_excerpt() hat ein wenig merkwürdige Mechanismen - wenn etwas an ihn weitergegeben wird, dann tut er nichts.

Hier ist die grundlegende Logik dahinter:

  • get_the_excerpt() sucht nach manuellem Auszug;
  • wp_trim_excerpt() meldet sich, wenn es keinen manuellen Auszug gibt und macht einen aus Inhalt oder Teaser.

Beide sind eng an globale Variablen gebunden und so Loop.

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

8
Rarst

Aktualisieren:

Hier ist eine Ableitung von wp_trim_excerpt (), die ich verwendet habe. Funktioniert 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);
}
6
Ardee Aram

Hier ist meine Einstellung zu einem "trim_excerpt", der das Post-Objekt oder eine Post-ID als Parameter verwendet.

Offensichtlich basierend auf dem, was im Kern enthalten ist. Ich weiß nicht, warum dies (und get_the_author ()) keine Nicht-Schleifen-Entsprechungen haben.

/**
     * 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
Tom Auger

Anhand der obigen Antworten anderer ist dies 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 benutze es in den <meta>-Tags in einer Funktion, um OpenGraph-Beschreibungen zu definieren. Also füge ich einfach hinzu:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
0
dpruth

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

Geänderte Funktion wp_trim_excerpt ():

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(']]>', ']]&gt;', $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);
}
0
user4742

+1 bis Rast. Es ist sehr seltsam, dass es so etwas wie get_the_excerpt ($ post-> ID) nicht gibt, wenn es ganz offensichtlich sein sollte, dass es so sein 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(']]>', ']]&gt;', $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 verknüpft ist. Und ja, ich habe keine Ahnung, was sie dachten. Aber von hier aus ersetzen Sie get_the_content durch $ text in Ihrem eigenen my_excerpt, und es sollte sich auf ähnliche Weise verhalten.

0
Ardee Aram