Как-то раз обратил внимание, что функция WordPress the_excerpt() (отрывок/цитата) какая-то громоздкая (на её выполнение уходит много времени и ресурсов, чем она этого заслуживает), в подробности, почему она такая, вдаваться не буду, скажу только, что the_excerpt() вызывает get_the_excerpt(), the_content() и ко всем им применяются различные хуки, включая сам the_excerpt(). Там получается немало операций, для всего-то вывода какого-то отрывка текста. Лично я к цитатам отношусь крайне просто – коротко сказать о чем статья, вырезав небольшой её кусок или описать ее вкратце.
С этим недостатком я мерился, до того момента, пока мне не понадобилась обрезать текст до определенного количества символов. Тогда то я и решил написать функцию, чтобы обрезала текст, который я ей даю и за одно решил ее универсализировать и сделать замену монстру the_excerpt().
Результат замены the_excerpt() меня порадовал: генерация страницы уменьшилась в среднем с 0,850 сек до 0,550 сек, при 9 вызовах the_excerpt() (это время на моем компьютере, на сервере естественно оно меньше). 9 вызовов – это количество выводимых постов в категории, к каждому из которых применялся the_excerpt().
Вот собственно и получившаяся у меня функция, которой можно заменить стандартную функцию WordPress the_excerpt().
Код
/* Обрезка текста - excerpt
maxchar = количество символов.
text = какой текст обрезать (по умолчанию берется excerpt поста, если его нету, то content, если есть тег <!--more-->, то maxchar игнорируется и берется все, что до него, с сохранением HTML тегов )
save_format = Сохранять перенос строк или нет. По умолчанию сохраняется. Если в параметр указать определенные теги, то они НЕ будут вырезаться из обрезанного текста (пример: save_format=<strong><a> )
echo = выводить на экран или возвращать (return) для обработки.
П.с. Шоткоды вырезаются. Минимальное значение maxchar может быть 22.
*/
function kama_excerpt($args=''){
global $post;
parse_str($args, $i);
$maxchar = isset($i['maxchar']) ? (int)trim($i['maxchar']) : 350;
$text = isset($i['text']) ? trim($i['text']) : '';
$save_format = isset($i['save_format']) ? trim($i['save_format']) : false;
$echo = isset($i['echo']) ? false : true;
if (!$text){
$out = $post->post_excerpt ? $post->post_excerpt : $post->post_content;
$out = preg_replace ("!\[/?.*\]!U", '', $out ); //убираем шоткоды, например:[Изображение не найдено]
// для тега <!--more-->
if( !$post->post_excerpt && strpos($post->post_content, '<!--more-->') ){
preg_match ('/(.*)<!--more-->/s', $out, $match);
$out = str_replace("\r", '', trim($match[1], "\n"));
$out = preg_replace( "!\n\n+!s", "</p><p>", $out );
$out = "<p>". str_replace( "\n", "<br />", $out ) ."</p>";
if ($echo)
return print $out;
return $out;
}
}
$out = $text.$out;
if (!$post->post_excerpt)
$out = strip_tags($out, $save_format);
if ( iconv_strlen($out, 'utf-8') > $maxchar ){
$out = iconv_substr( $out, 0, $maxchar, 'utf-8' );
$out = preg_replace('@(.*)\s[^\s]*$@s', '\\1 ...', $out); //убираем последнее слово, ибо оно в 99% случаев неполное
}
if($save_format){
$out = str_replace( "\r", '', $out );
$out = preg_replace( "!\n\n+!", "</p><p>", $out );
$out = "<p>". str_replace ( "\n", "<br />", trim($out) ) ."</p>";
}
if($echo) return print $out;
return $out;
}
Что умеет функция?
- Обрезать до определенного количества символов. Указывается в параметре maxchar;
- Понимает тег <!–more–> в посте. Если он присутствует желаемое количество выводимых символов игнорируется и выводится все что выше <!–more–> с сохранением HTML тегов;
- Можно указать сохранять переносы строк или писать весь текст в одну строку (по умолчанию переносы сохраняются, если нужен «сплошняк» ставим параметр save_format=0) ;
- Так же, можно использовать функцию, чтобы обрезать любой текст, который ей будет передан через параметр text . При этом половина кода пропускается, срабатывает только необходимая его часть.
Обрезка во всех случаях вычисляет количество символов, а затем убирает последние символы до пробела, сделано это для того, чтобы в конце всегда оставалось законченное слово, а не кусок недописанного слова (на мой взгляд это некрасиво).
Для использования вставляем указаный выше код в файл functions.php вашего шаблона, а где нужно вывести обрезанный текст вызываем функцию так: kama_excerpt("maxchar=100&text=бла бла");.
Чтобы заменить стандартный the_exerpt() нужно просто заменить the_exerpt(); на kama_excerpt(); Все это должно быть внутри цикла the loop. ВАЖНО! Парметр text при замене the_exerpt(); указывать не надо!
Пример использования функции, как обрезка любого текста (в любом месте шаблона):
$rrr = "Функция для обрезки текста для Worpress. Также можно применять и на других движках.";
kama_excerpt("text=$rrr&maxchar=50");
//Выведет: Функция для обрезки текста для Worpress. Также ...
При обрезке передаваемого функции текста, срабатывает только та часть функции которая необходима, т.е. никаких лишних операций.
На этом сайте я использую эту функцию 
Перепощено с http://wp-kama.ru/id_31/obrezka-teksta-zamenyaem-the-excerpt.html – Большое спасибо – лучшая реализация, которую я видел!