So erzwingen Sie Auszüge / Teaser in der Schleife

7

Wenn ich in "the loop" bin (Archivseiten usw.), wie erzwinge ich Teaser / Auszüge für alle Artikel, unabhängig davon, ob sie das <!--more-->Tag enthalten oder nicht?

Einzelheiten:

Ich beginne mit der _sVorlage, die den Inhalt von Blogposts mithilfe der content.phpVorlage anzeigt, in der die the_content()Funktion aufgerufen wird. Diese Funktion überprüft den Beitrag und versucht, das <!--more-->Tag in zu finden . Wenn sie einen findet, gibt sie einen Teaser und einen Link zum Lesen weiter zurück . Wenn dies nicht der Fall ist, wird einfach der gesamte Beitrag ausgegeben.

Ich möchte den ersten Teil behalten, dh das <!--more-->Tag respektieren, wenn der Inhaltsautor es verwendet hat, aber wenn er / sie es vergessen hat, möchte ich den Teaser / Auszug trotzdem automatisch anzeigen (so etwas wie der erste oder zweite Absatz).

Was ist der beste Weg, dies zu tun? Es gibt einen the_contentFilter, aber z. B. kommt der Text zum Lesen weiterer Informationen nicht dazu. Was würden Sie empfehlen?

Borek Bernard
quelle

Antworten:

3

BEARBEITEN

OK, es gibt eine sehr versteckte native Funktion, get_extended()die ich nie kannte und die @kaiser in seiner Antwort ausführlich erklärt hat . Meine Antwort sollte nur eine Erweiterung der Antwort von @kaiser sein

URSPRÜNGLICHE ANTWORT

Es gibt keine native Funktion, um dies zu tun. Das Beste hier wäre, eine PHP-Funktion strposzu verwenden, um nach mehr Tags zu suchen und dann etwas entsprechend dem Ergebnis zu tun.

Sie können so etwas versuchen

if( strpos( $post->post_content, '<!--more-->' ) ) {
    the_content( __( '&hellip; Read more about this article <span class="meta-nav">&rarr;</span>' ) );
}
else {
    the_excerpt();
}
Pieter Goosen
quelle
Möglicherweise der einfachste Ansatz. Ein Nachteil ist, dass ein Auszug tatsächlich ganz anders / anders aufgebaut ist als WordPress für Teaser. Daher muss ich meine eigene Funktion dafür erstellen und einen Teil des internen WP-Codes duplizieren, da er nicht sehr gut berücksichtigt ist. Trotzdem ist dies wahrscheinlich der einfachste Weg, danke.
Borek Bernard
Wenn Sie benutzerdefinierte Auszüge benötigen, können Sie sich diesen Beitrag
Pieter Goosen
8

Natürlich gibt es eine API-Funktion - versteckt in der Tiefe des Kerns -, um die Teile vor und nach dem <!--more-->Tag im Inhalt abzurufen . Aufgrund von Namenskonventionen von genau Null werden die praktischen Teile in WP häufig überwacht : get_extended().

// In the loop, after `the_post()` filled the global `$post`:
$info = get_extended( $post );

// The resulting data is an Array:
[Array] $info 
    'main'      => the text before the `<!--more-->`
    'extended'  => the content after the `<!--more-->` comment
    'more_text' => the custom "Read More" text

Das Ergebnis würde folgendermaßen aussehen:

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post();

        $info = get_extended( $GLOBALS['post'] );

        if ( ! empty( $info['extended'] ) )
        {
            the_content( ! empty( $info['more_text'] ) ? $info['more_text'] : 'Read more' );
        }
        else
        {
            the_excerpt();
        }
    }
}

und wechseln Sie den Auszug und den Inhalt basierend auf der Existenz von <!--more-->. Beachten Sie, dass WP standardmäßig nur <!--more--> Leerzeichen akzeptiert . Wenn Ihre Autoren es also manuell eingeben und Leerzeichen hinzufügen, <!-- more -->funktioniert dies (auf jeden Fall) nicht.

Kaiser
quelle
Vielen Dank für Ihre Antwort. Ich wusste nie über diese Funktion. Tolle Arbeit und vielen Dank, dass Sie diese verborgene Zukunft das Licht auf WPSE erblicken lassen
Pieter Goosen
@PieterGoosen Ich habe gerade herausgefunden, dass der Brauch auch more_textzurückgegeben wird. Ich frage mich, was das ist. Vielleicht möchten Sie dort etwas recherchieren? :)
Kaiser
Nun, ich werde wahrscheinlich meine eigene "mytheme_the_content ()" - Funktion haben, die die <!--more-->Suche durchführt. Wenn sie nicht gefunden wird, erhalte ich den gerenderten HTML-Inhalt des Beitrags und gebe möglicherweise nur die ersten beiden Absätze zurück. Ich mag die Ausgabe der Auszugsfunktionen nicht, und obwohl es Möglichkeiten gibt, sie zu ändern, wie Pieters Beitrag zeigt, ist es wahrscheinlich zu viel Aufwand für meinen Anwendungsfall. Danke für die tollen Infos.
Borek Bernard