web-dev-qa-db-fra.com

Comment forcer des extraits/teasers dans la boucle

Quand je suis au courant (pages d'archives, etc.), comment forcer l'affichage des extraits et des extraits pour tous les articles, qu'ils contiennent ou non la balise <!--more-->?

Détails:

Je commence avec le modèle _s qui affiche le contenu d'un article de blog en utilisant le modèle content.php dans lequel il appelle la fonction the_content(). Cette fonction inspecte la publication et essaie de trouver la balise <!--more-->. Si elle en trouve une, elle renvoie un teaser et un lien en savoir plus, sinon elle affiche simplement l'intégralité de la publication.

J'aimerais garder la première partie, c'est-à-dire respecter la balise <!--more--> si l'auteur du contenu l'a utilisée, mais s'il l'a oubliée, je souhaite quand même afficher automatiquement le teaser/extrait (quelque chose comme le premier paragraphe ou les deux).

Quelle est la meilleure façon de procéder? Il y a un filtre the_content mais par ex. le texte de personnalisation plus lu n'y entre pas. Que recommanderais-tu?

7
Borek Bernard

EDIT

OK, il y a une fonction native très cachée, get_extended(), que je ne connaissais pas et que je n’avais pas beaucoup expliquée par @kaiser dans sa réponse . Ma réponse ne devrait être qu'une extension de celle de @kaiser

RÉPONSE ORIGINALE

Il n'y a pas de fonction native pour faire cela. Le mieux ici serait d’utiliser une fonction PHP telle que strpos pour rechercher le tag le plus, puis de faire quelque chose en fonction du résultat.

Vous pouvez essayer quelque chose comme ça

if( strpos( $post->post_content, '<!--more-->' ) ) {
    the_content( __( '&hellip; Read more about this article <span class="meta-nav">&rarr;</span>' ) );
}
else {
    the_excerpt();
}
3
Pieter Goosen

Bien sûr, il existe une fonction API - cachée dans la profondeur du cœur - permettant de récupérer les pièces avant et après la balise <!--more--> dans le contenu. En raison des conventions de nommage exactes = zéro , les parties pratiques de WP sont souvent ignorées: 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

Le résultat ressemblerait à ceci:

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

et permuter l'extrait et le contenu en fonction de l'existence de <!--more-->. Gardez à l'esprit que par défaut, WP n'accepte que <!--more--> sans espaces . Donc, si vos auteurs le saisissent à la main et ajoutent des espaces, le <!-- more --> ne fonctionnera pas (dans tous les cas).

8
kaiser