How to control manual excerpt length?

I have a website in which I need to control the displayed excerpt length.
Some of the posts might have manual excerpt so I can’t use the excerpt_length filter.

I can, of course, use some kind of substr(), but was looking for a more elegant solution (if such exists).

Related posts

Leave a Reply

6 comments

  1. Take a look on my answer here: Best Collection of Code for your functions.php file

    If I understood your question correctly, it does what you are looking for.

    Place this in functions.php:

    function excerpt($num) {
        $limit = $num+1;
        $excerpt = explode(' ', get_the_excerpt(), $limit);
        array_pop($excerpt);
        $excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Read more</a>)";
        echo $excerpt;
    }
    

    Then, in your theme, use the code <?php excerpt('22'); ?> to limit the excerpt to 22 characters.

    🙂

  2. I’d say just look at how core does it: http://phpxref.ftwr.co.uk/wordpress/wp-includes/formatting.php.source.html#l1840

    I took the liberty of putting the code here for ease of copying and pasting.

    global $post;
    if( empty($post->post_excerpt) ){
      $text = apply_filters( 'the_excerpt', get_the_excerpt() );
    } else {
      $text = $post->post_excerpt;
      $text = strip_shortcodes( $text );
      $text = apply_filters('the_content', $text);
      $text = str_replace(']]>', ']]&gt;', $text);
      $text = strip_tags($text);
      $excerpt_length = apply_filters('excerpt_length', 55);
      $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
      $words = preg_split("/[nrt ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
      if ( count($words) > $excerpt_length ) {
        array_pop($words);
        $text = implode(' ', $words);
        $text = $text . $excerpt_more;
      } else {
        $text = implode(' ', $words);
      }
    }
    
  3. Try this: You can control the amount of words the excert outputs with the filter “excerpt_length” below are a couple examples of how you can control the size based on different conditions

    add_filter( 'excerpt_length', 'new_excerpt_length' );
    function new_excerpt_length( $more ) {
        if(is_front_page()){
            if(has_post_thumbnail()){
                return 15;
            } else {
                return 45;
            }
        } else {
            return 100;
        }
    }
    

    EDIT: Crap, I just noticed that you said the filter approach was a no go. oh well this is for other people who get here via google and want this then.

  4. Enter this code in your functions.php

    /* easy excerpt limitation
    */
    function
    easy_excerpt($limit) {
    $excerpt = explode(' ', get_the_excerpt(), $limit);
    if (count($excerpt)>=$limit) {
    array_pop($excerpt);
    $excerpt = implode(" ",$excerpt);
    } else {
    $excerpt = implode(" ",$excerpt);
    }
    $excerpt = preg_replace('`[[^]]*]`','',$excerpt);
    return $excerpt;
    } 
    

    and use echo easy excerpt(mylimit) instead of the_excerpt()
    It works fine.