Extraits WordPress : modifier leur affichage (read more, …)

Dans WordPress, on peut afficher une liste d’article en utilisant soit l’extrait soit tout le contenu. Et l’extrait peut être généré automatiquement ou rempli manuellement. Des fonctions en PHP permettent de régler la longueur maximum de l’extrait automatique, d’ajouter un lien et […] ou « Lire la suite », d’accepter ou non les retours à la ligne et autres éléments de mise en page du résumé. 

Le problème

Il est relativement simple (il y a plein d’exemples partout) de définir des régles pour l’extrait généré automatiquement. Ca l’est beaucoup moins pour l’extrait manuel (celui qu’on remplit dans une case tout en bas de la page d’édition d’un article).

Les sources d’inspiration

Le code proposé sur WordPress.StackExchange remplit presque entièrement les spécifications souhaitées :

  • accepter des éléments de mise en page dans l’extrait (retour à la ligne, affichage de liste, …) : OK ;
  • Ne pas couper les mots des extraits automatiques : OK ;
  • Ajouter un lien « lire la suite » à la fin de tous les extraits : OK pour les extraits créées automatiquement, pas pour les extraits créés manuellement.

Pourquoi ça ne fonctionne pas pour les extraits manuels ?

La ligne suivante sert à ajouter le lien « lire la suite » à la fin des extraits :

$excerpt_more = apply_filters( 'excerpt_more', ' ' . $excerpt_end );

Mais except_more ne s’applique qu’aux résumés générés automatiquement. Il faut donc que j’arrive à ajouter ce même lien à un extrait manuel…

En fait l’ensemble du code situé à l’intérieur du if (  » == $wpse_excerpt ) en ligne 26 s’applique exclusivement aux extraits automatique.

Au bout d’un certain temps, et grâce à l’ajout judicieux d’un ‘AAAA ! ‘ avant les extraits manuels, j’ai fini par comprendre qu’il fallait tout simplement ajouter la ligne 78 avant que le résumé manuel ne soit géré par la ligne 81.

<?php

# Change Read More link in automatic Excerpts
remove_filter('get_the_excerpt', 'wp_trim_excerpt');  // remove WordPress filter first
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');




function wpse_allowedtags() {
    // Add custom tags to this string
	// <a>,<img>,<video>,<script>,<style>,<audio> are not in
    return '<br>,<em>,<i>,<ul>,<ol>,<li>,<p>'; 
}

if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : 

    function wpse_custom_wp_trim_excerpt($wpse_excerpt) {
		$raw_excerpt = $wpse_excerpt;
		
		// text for the "read more" link
		$rm_text = __( 'La suite &raquo;', 'stargazer' ) ;
		$excerpt_end = ' <a class="more-link" href="'. esc_url( get_permalink() ) . '">' . $rm_text . '</a>'; 
		
		
        if ( '' == $wpse_excerpt ) {  

            $wpse_excerpt = get_the_content('');
            $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
            $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
            $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
            $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */

            //Set the excerpt word count and only break after sentence is complete.
                $excerpt_word_count = 75;
                $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
                $tokens = array();
                $excerptOutput = '';
                $count = 0;

                // Divide the string into tokens; HTML tags, or words, followed by any whitespace
                preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

                foreach ($tokens[0] as $token) { 

                    if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                    // Limit reached, continue until , ; ? . or ! occur at the end
                        $excerptOutput .= trim($token);
                        break;
                    }

                    // Add words to complete sentence
                    $count++;

                    // Append what's left of the token
                    $excerptOutput .= $token;
                }

            $wpse_excerpt = trim(force_balance_tags($excerptOutput));
		   
				// $wpse_excerpt .= $excerpt_end ;
				$excerpt_more = apply_filters( 'excerpt_more', ' ' . $excerpt_end ); 

                $pos = strrpos($wpse_excerpt, '</');
                if ($pos !== false) {
					// Inside last HTML tag
					$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last word 
				} else {
					// After the content
					$wpse_excerpt .= $excerpt_more; //Add read more in new paragraph 
				}
                
            return $wpse_excerpt;   

        } 
		
		// add read more link to the manual extract
		$wpse_excerpt .= $excerpt_end ;
		// return the manual extract
		// DELETE the 'AAAA !' . before $wpse_excerpt : it's used to show the manual extracts for debugging. 
        return apply_filters('wpse_custom_wp_trim_excerpt', 'AAA ! ' . $wpse_excerpt, $raw_excerpt);
    }
  
endif; 
?>

Et voilà, ça fonctionne pour tous les extraits, quelle que soit la manière dont ils sont générés !

Pourquoi diable utiliser les extraits manuels ?

On peut en effet se demander pourquoi j’ai passé tant de temps à résoudre ce problème !

Ma conviction c’est que le début d’un article sert à situer le contexte, pas à en faire le résumé. J’utilise donc le début de l’article comme introduction à la suite. C’est le résumé manuel qui me sert comme extrait dans les listes d’articles. Le résumé a pour vocation de donner les clés pour que les visiteurs puissent décider si l’article les intéresse.

 

Poster un Commentaire

avatar
  S’abonner  
Notifier de