excerpt_length не работает - как исправить
Я пытаюсь создать тему и хочу контролировать длину цитат записей, добавив такой код в functions.php:
function theme_excerpt_length( $length ) {
return 45; // Возвращаем новую длину цитаты - 45 слов
}
add_filter( 'excerpt_length', 'theme_excerpt_length', 999 ); // Добавляем фильтр с высоким приоритетом
Но это не дает желаемого эффекта сокращения цитат до 45 слов. Более того, даже без этой функции некоторые цитаты длиннее стандартных 55 слов. В чем может быть проблема?

Есть два быстрых способа отображения пользовательской длины цитат в вашей теме с использованием wp_trim_words
. Помните, что если вы используете the_excerpt()
, длина цитаты всегда будет ограничена 55 словами, никогда больше. С другой стороны, если использовать the_content()
, вы можете указать длину цитаты более 55 слов.
Используйте следующий код для отображения цитаты. Не забудьте заменить get_the_excerpt
на get_the_content
, если вам нужна цитата длиннее 55 слов, а также заменить <a href="'. esc_url( get_permalink() ) . '">' . ' …' . __( 'Read more »', 'pietergoosen' ) . '</a>
на любой желаемый конец цитаты. В моём примере отображается текст "Читать далее" с названием записи.
function pietergoosen_custom_excerpts($limit) {
return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . ' …' . __( 'Читать далее »', 'pietergoosen' ) . '</a>');
}
Теперь просто используйте echo pietergoosen_custom_excerpts($limit);
в любом месте ваших шаблонов, где нужно отобразить цитаты. Просто замените $limit
на желаемое количество слов, например, echo pietergoosen_custom_excerpts(45);
для отображения 45 слов.
РЕДАКТИРОВАНИЕ
Также ознакомьтесь с моим ответом о пользовательских цитатах

Это функция, которую я использую для контроля длины анонсов/контента, особенно в ситуациях, когда конечный пользователь вряд ли вспомнит добавить тег <!--more-->
, но дизайн темы этого требует.
function excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt).'...';
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
return $excerpt;
}
После этого вы можете изменить код вывода анонса в файлах шаблона с:
<?php the_excerpt();?>
...на:
<?php echo excerpt(25);?>
где 25 - это количество символов, которое вы хотите отобразить. При разработке тем я предпочитаю использовать символы вместо слов, так как интервалы получаются более последовательными.

Я попробовал это. Длина уменьшается, но не точно до указанного размера анонса. Например, я указал 45, но все равно получил анонс вроде: "Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem..."

Если у вас есть пользовательское краткое описание (excerpt), фильтр "excerpt_length" не будет работать для него. Вы можете использовать этот фильтр для обрезки пользовательского excerpt.
function custom_excerpt_length($excerpt) {
if (has_excerpt()) {
$excerpt = wp_trim_words(get_the_excerpt(), apply_filters("excerpt_length", 30));
}
return $excerpt;
}
add_filter("the_excerpt", "custom_excerpt_length", 999);
Удачи!

Если вы нашли этот вопрос, потому что используете блок "Цитата" в редакторе Gutenberg и пытаетесь установить для него длину по умолчанию (или любое другое значение, отличное от изначально разрешенного диапазона 10-100 слов), вы можете обнаружить, что фильтр excerpt_length
не влияет на блок, и вы даже не можете использовать фильтр the_excerpt
для переопределения содержимого цитаты. Это связано с последними обновлениями блока "Цитата" в WordPress.
Однако вы можете использовать следующий код для редактирования настроек по умолчанию блока "Цитата" в Gutenberg:
function filter_metadata_registration( $metadata ) {
if ($metadata['name'] === 'core/post-excerpt') {
$metadata['attributes']['excerptLength'] = [
'type' => 'number',
'default' => 9999,
];
}
return $metadata;
};
add_filter( 'block_type_metadata', 'filter_metadata_registration' );
Подробнее об этом: https://core.trac.wordpress.org/ticket/59348
