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

up vote 5 down vote accepted

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);
    $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
    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 '11 at 15:46

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

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 ) {
    $text = implode(' ', $words);
    $text = $text . $excerpt_more;
  } else {
    $text = implode(' ', $words);

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

Simply it can be done as below .

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

Reference: Codex

Enter this code in your functions.php

/* easy excerpt limitation
easy_excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
$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.

Your Answer


By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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