6

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).

6 Answers 6

6

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
  • 2
    Your function should use a proper integer and not a string to pass numeric values or could just convert inside the function, eg. $num = (int) $num;. '1' != 1 .. :)
    – t31os
    Jan 4, 2011 at 15:46
  • Is this still the best practice? Or is there a more efficient approach now?
    – Lewis
    Mar 9, 2019 at 17:18
6

With the recent version of Wordpress (v.3.3.0+), you can actually use wp_trim_words.

function excerpt($limit) {
    return wp_trim_words(get_the_excerpt(), $limit);
}

See also: https://stackoverflow.com/a/17177847/851045

1

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("/[\n\r\t ]+/", $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);
  }
}
1

Simply it can be done as below .

function custom_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Reference: Codex

0

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.

-1

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.

2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.