Бывает так что нужно обрезать текст в привьюшках но нужно чтобы осталась и кнопка “читать далее”. Как это сделать описано далее.
Я сам сталкивался с подобным. Бывает что либо не сделал тег читать далее, или был перенос сайта, и страниц слишком много чтобы их переделывать, а в блоге либо в поиске сайта wordpress не смотрятся полные записи.
Так во чтобы сократить текст или отобразить описание статьи или страницы нужно всего лиш вставить в functions.php вашей темы следующий хук.
/**
начало хука
*/
function kama_excerpt( $args = '' ){
global $post;
if( is_string($args) )
parse_str( $args, $args );
$rg = (object) array_merge( array(
'maxchar' => 350, // Макс. количество символов которые будут выводится.
'text' => '', // Какой текст обрезать (по умолчанию post_excerpt, если нет post_content.
)
// Если в тексте есть ``, то `maxchar` игнорируется и берется
// все до вместе с HTML.
'autop' => true, // Заменить переносы строк на <p> и <br> или нет?
'save_tags' => '', // Теги, которые нужно оставить в тексте, например '<strong><b><a>'.
'more_text' => 'Читать дальше...', // Текст кнопки `Читать дальше`.
'ignore_more' => false, // нужно ли игнорировать в контенте
), $args );
$rg = apply_filters( 'kama_excerpt_args', $rg );
if( ! $rg->text )
$rg->text = $post->post_excerpt ?: $post->post_content;
$text = $rg->text;
// убираем блочные шорткоды: [foo]some data[/foo]. Учитывает markdown
$text = preg_replace( '~[([a-z0-9_-]+)[^]]*](?!().*?[/1]~is', '', $text );
// убираем шоткоды: [singlepic id=3]. Учитывает markdown
$text = preg_replace( '~[/?[^]]*](?!()~', '', $text );
$text = trim( $text );
//
if( ! $rg->ignore_more && strpos( $text, '') ){
preg_match('/(.*)/s', $text, $mm );
$text = trim( $mm[1] );
$text_append = ' <a href="'. get_permalink( $post ) .'#more-'. $post->ID .'">'. $rg->more_text .'</a>';
}
// text, excerpt, content
else {
$text = trim( strip_tags($text, $rg->save_tags) );
// Обрезаем
if( mb_strlen($text) > $rg->maxchar ){
$text = mb_substr( $text, 0, $rg->maxchar );
$text = preg_replace( '~(.*)s[^s]*$~s', '1...', $text ); // кил последнее слово, оно 99% неполное
}
}
// сохраняем переносы строк. Упрощенный аналог wpautop()
if( $rg->autop ){
$text = preg_replace(
array("/r/", "/n{2,}/", "/n/", '~</p><br ?/?>~'),
array('', '</p><p>', '<br />', '</p>'),
$text
);
}
$text = apply_filters( 'kama_excerpt', $text, $rg );
if( isset($text_append) )
$text .= $text_append;
return ( $rg->autop && $text ) ? "<p>$text</p>" : $text;
}
/* Конец хука*/
Как работает Хук
Обрезка до количества необходимых символов. Указывается в параметре
maxchar
.Понимает тег <!–more–> в записи. Если <!–more–> присутствует тогда выводится привью статьи как обычно, с сохранением HTML разметки.
Можно указать сохранять переносы строк или писать весь текст в одну строку. По умолчанию переносы сохраняются, если нужен сплошной текс ставим параметр autop=0.
Можно указан какие HTML теги не нужно удалять, например мы хотим оставить тег stront или em, тогда указываем их в параметре
save_tags
:save_tags=<strong><em>
- Также, можно использовать функцию, чтобы обрезать любой текст, который ей будет передан через параметр
text
.
Обрезка во всех случаях вычисляет количество символов, а затем убирает последние символы до пробела. Нужно это для того, чтобы в конце всегда оставалось законченное слово, а не кусок недописанного слова.