Limiting the number of words or characters in the slug/permalink

Limiting the number of words or characters in WordPress slug/permalink. I would like to limit the number to the first 5 words (or 20 characters) even if the post title is longer.
example:
Title: Welcome to my site – this is my first post
url: mysite.com/welcome-to-my-site

Some function or alteration in the core WordPress to achieve this result?

Related posts

Leave a Reply

1 comment

  1. You can probably do something with the sanitize_title hook based on the context conditionally, but I’m not familiar enough with where else sanitize_title is used to say for sure that this is a good solution. The trick to this is going to be limiting your slug without including stupid words that are going to hurt your SEO. As a launching point, try this:

    add_filter( 'sanitize_title', 'wpse52690_limit_length', 1, 3 );
    
    function wpse52690_limit_length( $title, $raw_title, $context ) {
        //  filters
        if( $context != 'save' )
            return $title;
    
        //  vars
        $desired_length = 20; //number of chars
        $desired_words = 5; //number of words
        $prohibited = array(
            'the'
            ,'in'
            ,'my'
            ,'etc'
            //put any more words you do not want to be in the slug in this array
        );
    
        //  do the actual work
        // filter out unwanted words
        $_title = explode( ' ', $title );
        //if you want more than one switch to preg_split()
        $_title = array_diff( $_title, $prohibited );
        // count letters and recombine
        $new_title = '';
        for( $i=0, $count=count($_title); $i<$count; $i++ ) {
            //check for number of words
            if( $i > $desired_words )
                break;
            //check for number of letters
            if( mb_strlen( $new_title.' '.$_title[$i] ) > $desired_length )
                break;
    
            if( $i != 0 )
                $new_title .= ' ';
            $new_title .= $_title[$i];
        }
    
        return $new_title;
    }
    

    Note that that is completely untested and I literally just wrote it, so it may have some kinks in it, but it’s a good starting place for you.