I know toscho doesn’t like this very much, but anyway: Converted the input args to an array:
function utf8_truncate( $args = array( 'string' => null, 'max_chars' => 200, 'append' => "\xC2\xA0…" ) )
{
$args['string'] = strip_tags( $args['string'] );
$args['string'] = html_entity_decode( $args['string'], ENT_QUOTES, 'utf-8' );
// \xC2\xA0 is the no-break space
$args['string'] = trim( $args['string'], "\n\r\t .-;–,—\xC2\xA0" );
$length = strlen( utf8_decode( $args['string'] ) );
// Nothing to do.
if ( $length < $args['max_chars'] )
{
return $args['string'];
}
// mb_substr() is in /wp-includes/compat.php as a fallback if
// your the current PHP installation doesn't have it.
$args['string'] = mb_substr( $args['string'], 0, $args['max_chars'], 'utf-8' );
// No white space. One long word or chinese/korean/japanese text.
if ( FALSE === strpos( $args['string'], ' ' ) )
{
return $args['string'] . $args['append'];
}
// Avoid breaks within words. Find the last white space.
if ( extension_loaded( 'mbstring' ) )
{
$pos = mb_strrpos( $args['string'], ' ', 'utf-8' );
$short = mb_substr( $args['string'], 0, $pos, 'utf-8' );
}
else
{
// Workaround. May be slow on long strings.
$words = explode( ' ', $args['string'] );
// Drop the last word.
array_pop( $words );
$short = implode( ' ', $words );
}
return $short . $args['append'];
}
This allows to use it like this (you possibily missed how to use arrays anyway):
$args = array(
'string' => 'bla'
,'max_chars' => 50 // INPUT LENGTH HERE
);
echo '<p>' . utf8_truncate( $args ) . '</p>';
You could also switch this on demand:
if ( is_page() )
{
$args['max_chars'] = 100;
}
elseif ( is_archive() )
{
$args['max_chars'] = 50;
}
elseif ( is_whatever() )
... etc ...
}