apply_filters () und the_excerpt liefern unerwartete Ergebnisse


10

Ich habe das Gefühl, dass mir hier etwas ziemlich Offensichtliches fehlt, aber ich kann WordPress anscheinend nicht dazu bringen, zusammenzuarbeiten.

Ich generiere Facebook OG-Tags mit einer Funktion. Bis auf den Auszug funktioniert alles einwandfrei.

Gibt es seit der Ablehnung von get_the_excerpt($post->ID)eine andere Möglichkeit, einen Auszug zu erstellen, ohne eine ganz neue Schleife erstellen zu müssen? Es scheint mir übertrieben.

Mein erster Instinkt war apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Das gibt mir den vollständigen Beitrag mit HTML-formatierten Inhalten. Okay, muss falsch sein. Also habe ich die nächste logische Idee ausprobiert:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

Kein Würfel. Jetzt gibt es kein HTML, aber es ist immer noch der vollständige Beitrag (was wirklich verwirrend ist).

Okay kein Problem. Lassen Sie uns all die ausgefallenen Sachen überspringen und einfach zum gekürzten Eintrag gehen:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Keine Änderung.

Meine Frage lautet also: Was zum Teufel ist los? Fehlt mir hier etwas?

Ich bin in den WP-Kern gekommen, um herauszufinden, wie es the_excerpt()funktioniert, und es scheint mit meinem Aufruf identisch zu sein:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Ich habe einige Fragen, die auf meinen Erkenntnissen beruhen:

  1. Warum wird der Filter nicht wie erwartet angewendet?
  2. Gibt es eine Möglichkeit, den Auszug außerhalb der Schleife abzurufen, ohne eine neue Schleife zu erstellen?
  3. Bin ich verrückt?

Vielen Dank im Voraus für einen Blick. Ich bin hier ziemlich ratlos.


get_the_excerpt()wird nicht veraltet, nur der zusätzliche Parameter, der früher an ihn übergeben wurde, wird nicht mehr verwendet.
Milo

Entschuldigung, das habe ich gemeint. Danke fürs klarstellen.
Jlengstorf

Du bist verrückt! . . . wie bin ich lol
pythonian29033

Antworten:


16

Es stellte sich heraus, dass die Antwort in war wp_trim_excerpt().

Es ist definiert in wp-includes/functions.php:1879:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Übergebener Text wird also nicht verarbeitet. Es funktioniert nur, wenn es mit einem leeren Parameter aufgerufen wird.

Um dies zu lösen, habe ich meinem Thema einen Schnellfilter hinzugefügt, der das Problem löst:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

Es ist etwas überflüssig, aber es gefällt mir besser, als jedes Mal, wenn ich einen Auszug erstellen möchte, neue Schleifen zu öffnen.


1
Ah, mir war nicht klar, dass Sie nur nach der Textoperation suchen (nicht aus der Datenbank abrufen).
hakre

Keine Bange. Ich fürchte immer, ich mache keinen Sinn, wenn ich Fragen stelle. Ich wurde aus der Datenbank ziehen, aber ich wollte nicht eine ganze ‚nother Schleife öffnen , da ich Dinge wie haben zur get_the_title($post->ID)Verfügung. Die letzte Codezeile war$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

Ich fühle mich wirklich dumm, das zu fragen, aber wie nennt man diesen neuen Filter? Ich habe es als $content = apply_filters( 'rw_trim_excerpt', $content );und versucht $content = rw_trim_excerpt($content);, aber keines davon hat funktioniert (das erste hat die Ausgabe nicht gekürzt und das spätere hat einen Fehler erzeugt).
Eric K

2
@QuantumDynamix Hiermit können Sie die get_the_excerptBehandlung the_excerptso ändern , dass sie nachahmt , sodass Sie Folgendes aufrufen können : apply_filters('get_the_excerpt', $content);.
Jlengstorf

Puh! nett aus der Sicht eines Wpress Noobs, danke
pythonian29033

1

Versuchen:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Siehe: get_postCodex für alle verfügbaren Rückkehrmitglieder.


4
Das wird leer zurückgegeben, wenn für den Beitrag kein Auszug eingegeben wurde. Ich muss die Aktionen von get_the_excerpt () nachahmen (einen Auszug erstellen, falls keiner existiert).
Jlengstorf

Das Anwenden des Filters reicht nicht aus, daher stellen Sie die falsche Frage. Keine Ahnung, warum Sie nach einem Auszug suchen, wenn es keinen gibt. get_the_excerpt()ahmt das nicht nach, überprüfen Sie die Quelle, es greift nur auf die Mitgliedsvariable zu, von $postder es ist post_excerpt. Siehe auch den Codex-Link in der Antwort.
hakre

3
Ab dem Codex-Eintrag the_excerpt: "Es wird ein automatischer Auszug angezeigt, der auf die ersten 55 Wörter des Inhalts des Beitrags verweist." Ich möchte dieses Verhalten außerhalb der Schleife nachahmen.
Jlengstorf

Erstellen Sie vorübergehend eine zweite Schleife und fragen Sie diese Datei anhand ihrer ID ab, um eine schnelle Lösung zu finden. Siehe Sekundärschleifen - codex.wordpress.org/Function_Reference/…
hakre

1
Danke für den Link. Ich wusste, dass ich eine zusätzliche Schleife einrichten könnte, aber es scheint übertrieben. Meine Lösung war das Hinzufügen eines Filters. Ich sehe es jetzt als ein kleines Ellbogenfett für viel weniger Code später.
Jlengstorf

0

Sie können meine benutzerdefinierte Funktion verwenden, um den Inhalt zu filtern (er stammt aus NARGA Framework ).

  • Wenn der Beitrag einen benutzerdefinierten Auszug enthält, zeigen Sie ihm stattdessen den Inhalt an
  • Automatisch einen Auszug aus dem Inhalt generieren, wenn der Beitrag kein benutzerdefiniertes Zertifikat enthält
  • Shortcode, HTML-Code automatisch trimmen, [...] entfernen, Text "Read More" hinzufügen (übersetzbar)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
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.