Настройка get_the_excerpt() для определенной длины и вывода "Читать далее"
Я настраиваю шаблон. Есть список, который берет вступление из первых 1-2 абзацев (все статьи из категории). Если я устанавливаю длину отрывка в 295 слов, иногда список захватывает дополнительные слова из следующего абзаца. Я хотел бы добавить тег "Читать далее", чтобы остановить это. Может кто-нибудь помочь с этой частью?
<div id="all-div-cabrand-content-stories">
<div class="kids-families-con-cabrand-stories">
<?php echo get_the_post_thumbnail($page->ID, 'thubmnailstorysmall'); ?>
</div>
<div class="kids-con-cabrand-new-stories">
<span>
<?php print substr(get_the_excerpt(),wp_trim_excerpt(),295); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php the_permalink() ?>" rel="bookmark">Перейти к статье и видео</a></i>
<br/>
</span>
</div>
</div>

Для получения текста определенной длины можно использовать функцию wp_trim_words. Она принимает 3 параметра.
- Текст для обрезки. Например:
get_the_content()
- Количество слов. Например:
295
- Что добавить в конец текста. Например:
''
означает ничего.
Используйте так:
<span>
<?php echo wp_trim_words( get_the_content(), 295, '' ); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php
the_permalink() ?>" rel="bookmark">Читать статью & Смотреть видео</a></i>
<br/>
</span>

Вы можете извлечь первый или два абзаца с помощью регулярного выражения (regexp)
function custom_excerpt( $content = '' ){
if( empty( $content ) )
return $content;
$result = '';
$matches = array();
// извлекаем все абзацы из $content
preg_match_all( '#<\s*p[^>]*>(.*?)<\s*/\s*p>#ui', $content, $matches );
if( ! empty( $matches ) ){
// добавляем первый абзац
$result = $matches[0][0];
// добавляем второй абзац, если он есть
if( isset( $matches[0][1] ) )
$result .= $matches[0][1];
// устанавливаем длину анонса
add_filter( 'excerpt_length', 'custom_excerpt_length' );
// создаем кастомный анонс
$result = custom_trim_excerpt( $result );
}
return $result;
}
function custom_excerpt_length(){
return 295;
}
function custom_trim_excerpt( $text = '' ){
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
return $text;
}
Вызовите функцию с помощью
<?php print custom_excerpt( get_the_content( 'Читать далее' ) ); ?>
Это немного сложно, потому что вы не можете передать текст в wp_trim_excerpt()
. wp_trim_excerpt()
просто вернет текст, если он передан.
Вам придется скопировать и немного изменить функцию.

Вы можете использовать эту функцию:
function get_excerpt_trim($num_words='20', $more='...'){
$excerpt = get_the_excerpt();
$excerpt = wp_trim_words( $excerpt, $num_words , $more );
return $excerpt;
}
https://codex.wordpress.org/Function_Reference/wp_trim_words

Вы можете использовать встроенную функцию
// Изменяем длину анонса
function custom_excerpt_length( $length ) {
return 20; // Возвращаем 20 слов вместо стандартных 55
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Чтобы получить желаемый результат, вам нужно сделать две вещи.
1) Установить пользовательскую длину цитаты (в словах, а не в символах), что лучше всего достигается, следуя этому ответу.
2) Просто вызовите wp_trim_excerpt(), не оборачивая его в substr
Ваша строка кода выше не делает то, что вы ожидаете. Я полагаю, она возвращает первые 295 символов цитаты, но я не совсем уверен, что функция php substr() сделает, когда вы передадите ей строку в качестве второго аргумента, хотя она ожидает целое число.
