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


20

Ich erstelle ein Thema, das möglicherweise Dutzende von Beiträgen auszugsweise auf der Homepage anzeigt. Ich habe keine manuellen Auszüge für alle meine Beiträge, daher $post->post_excerptsind 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 so auf 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 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


Sie können versuchen, die $myvar = apply_filters( 'the_excerpt', $myvar );
Auszugsfilter aufzurufen

Antworten:



8

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

Hier ist die grundlegende Logik dahinter:

  • get_the_excerpt() prüft auf manuellen Auszug;
  • wp_trim_excerpt() läutet ein, 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 zu entfernen wp_trim_excerpt()und eine eigene Trimmfunktion zu schreiben.


6

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

Sie müssen keine neue Antwort veröffentlichen. Sie können Ihre alte Antwort jederzeit bearbeiten, um neue Informationen hinzuzufügen. Sie können beispielsweise den Link zum WP-Code von Ihrer ersten Antwort in diese kopieren und dann Ihre erste Antwort löschen.
Jan Fabry

Zum Kopieren / Einfügen: $ raw_excerpt = $ text hinzufügen;
Svetoslav Marinov

1

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

0

+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(']]>', ']]>', $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.


azure_ardee : erwäge die Verwendung von wp_trim_words ()

0

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(']]>', ']]>', $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

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 einer Funktion, um OpenGraph-Beschreibungen zu definieren. Also füge ich einfach hinzu:

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

Was ist mit HTML-Inhalten? Wie wird dies mit Tags umgehen? Der Auszug entfernt auch HTML-Tags und Shortcodes. Was ist, wenn die ersten Wörter des Ausschnitts ein Bild enthalten? Das wird wahrscheinlich Ihr Layout brechen.
Brett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.