web-dev-qa-db-fra.com

Limiter the_excerpt avec un maximum de x caractères

Ce que j'essaie de faire:
Je souhaite afficher the_excerpt, mais j’ai un maximum de x caractères que the_excerpt peut utiliser, mais je ne souhaite pas afficher quelques caractères d’un mot, mais uniquement des mots entiers.

Quelques informations supplémentaires:
Ce code se trouve sur une page Web non unique/non permanente, telle que des archives, des catégories, une page d'accueil et des recherches, ce qui ne me permet pas d'utiliser <!--more-->.

Le code:
C'est le code que j'utilise:

add_filter( 'excerpt_length', function( ) {
    return 20;
} );

if ( have_posts() ):
    while( have_posts() ): the_post();
        the_excerpt( );
    endwhile;
endif;
1
Mike Madern
add_filter('wp_trim_excerpt', function($text){    
   $max_length = 140;

   if(mb_strlen($text, 'UTF-8') > $max_length){
     $split_pos = mb_strpos(wordwrap($text, $max_length), "\n", 0, 'UTF-8');
     $text = mb_substr($text, 0, $split_pos, 'UTF-8');
   }

   return $text;
});

Cela devrait prendre en compte votre longueur maximale et diviser le texte à la limite de Word la plus proche. Appliquez le filtre et appelez the_excerpt(); dans vos modèles.


Apparemment, il existe une fonction wp_trim_words de WP 3.3 que vous pouvez également utiliser, mais qui semble très inefficace du point de vue de la source. En plus d'utiliser 3 expressions rationnelles, il divise le texte en une série de mots, ce qui peut être très lent et la mémoire exhaustive pour de gros morceaux de texte ...

1
onetrickpony

Après quelques perplexités, j'ai trouvé cette solution:

$limit_characters = 120;

function new_excerpt_length( ) {
    global $length;
    return $length;
}

function get_the_excerpt_special( ) {
    global $limit_characters, $length;

    if(strlen( get_the_excerpt() ) > $limit_characters ) {
        $length--;
        return get_the_excerpt_special();
    } else {
        the_excerpt();
    }
}

if ( have_posts() ):
    while( have_posts() ): the_post();
        add_filter( 'excerpt_length', 'new_excerpt_length' );

        $length = 20;
        get_the_excerpt_special( );

        remove_filter( 'excerpt_length', 'new_excerpt_length' );

    endwhile;
endif;

Ça marche! YAY! Mais comme il doit appeler de manière répétée get_the_excerpt, la page ralentit un peu.

0
Mike Madern