get_the_excerpt │ хук-фильтр │ WP 1.2.0

Позволяет изменить отрывок записи, получаемый через get_the_excerpt().

Фильтр применяется к значению поля post_excerpt перед возвратом результата. Изменения не сохраняются в БД. Он также влияет на the_excerpt(), которая получает текст через get_the_excerpt().

По умолчанию к хуку подключена wp_trim_excerpt() с приоритетом 10. Если переданный текст пуст (после удаления пробелов по краям), она создаёт отрывок из контента записи. Обычно это первые 55 слов без HTML, с окончанием […]. Длину и окончание меняют фильтры excerpt_length и excerpt_more. Непустой отрывок, заданный вручную, автоматически не сокращается.

Выбирайте приоритет обработчика по задаче:

  • Меньше 10: изменить исходный текст до автоматического создания отрывка. Если вернуть непустую строку, стандартная генерация из содержимого не выполнится.
  • Больше 10: изменить результат после стандартной обработки.

Хук используется и в REST API: при подготовке excerpt.rendered записей и caption.rendered вложений. Поля raw содержат исходное значение. Если изменение нужно только для определённого типа записи, проверяйте $post->post_type.

В самой get_the_excerpt() хук не вызывается, если запись не найдена или post_password_required() возвращает true.

В REST API вызывается до проверки пароля для excerpt.rendered; при отсутствии доступа это поле затем становится пустой строкой.

Для изменения форматирования при выводе через the_excerpt() используйте фильтр the_excerpt. Он применяется после get_the_excerpt; к нему подключены, в частности, типографика и добавление абзацев.

Использование

add_filter( 'get_the_excerpt', 'wp_kama_get_the_excerpt_filter', 10, 2 );

/**
 * Function for `get_the_excerpt` filter-hook.
 * 
 * @param string  $post_excerpt The post excerpt.
 * @param WP_Post $post         Post object.
 *
 * @return string
 */
function wp_kama_get_the_excerpt_filter( $post_excerpt, $post ){
	// filter...
	return $post_excerpt;
}
$post_excerpt(строка)
Фильтруемый отрывок.
Изначально это значение $post->post_excerpt, которое может быть пустым.
К моменту вызова обработчика текст уже могли изменить предыдущие фильтры, включая wp_trim_excerpt().
$post(WP_Post)
Объект записи, для которой получают отрывок.
Используйте этот объект вместо глобальной $post: отрывок могут получать для другой записи.

Примеры

#1 Добавим ссылку «Читать далее» к отрывку

Пример действует только для записей типа post с заполненным полем отрывка. Проверка has_excerpt() отличает ручной отрывок от автоматически созданного.

add_filter( 'get_the_excerpt', 'mytheme_excerpt_read_more', 20, 2 );

function mytheme_excerpt_read_more( $excerpt, $post ) {

	if ( 'post' !== $post->post_type || ! has_excerpt( $post ) ) {
		return $excerpt;
	}

	return $excerpt . sprintf( <a href="%s">%s</a>',
		esc_url( get_permalink( $post ) ),
		esc_html__( 'Читать далее', 'mytheme' )
	);
}

#2 Ограничим длину отрывка

Фильтр excerpt_length сам по себе не сокращает отрывок. Здесь явно применим длину и окончание через wp_trim_words(). Также удалит HTML-теги.

add_filter( 'get_the_excerpt', 'mytheme_trim_manual_excerpt', 20, 2 );

function mytheme_trim_manual_excerpt( $excerpt, $post ) {

	if ( 'post' !== $post->post_type || ! has_excerpt( $post ) ) {
		return $excerpt;
	}

	$length = (int) apply_filters( 'excerpt_length', (int) _x( '55', 'excerpt_length' ) );
	$more   = apply_filters( 'excerpt_more', ' […]' );

	return wp_trim_words( $excerpt, $length, $more );
}

То же правило действует для произвольной непустой строки: передача её в

apply_filters( 'get_the_excerpt', $text, $post )

не запускает стандартное сокращение. Сначала используйте wp_trim_words(). При ручном вызове фильтра передавайте корректный объект записи вторым аргументом хука, поскольку обработчики могут его ожидать.

#3 Заменим пустой результат текстом-заглушкой

Приоритет 20 позволяет сначала выполнить стандартную генерацию. Заглушка появится, только если результат всё ещё пуст. Если нужна заглушка вместо генерации из содержимого, используйте приоритет 5.

add_filter( 'get_the_excerpt', 'mytheme_excerpt_fallback', 20, 2 );

function mytheme_excerpt_fallback( $excerpt, $post ) {

	if ( 'post' === $post->post_type && '' === trim( $excerpt ) ) {
		return __( 'Откройте запись, чтобы прочитать материал.', 'mytheme' );
	}

	return $excerpt;
}

Список изменений

С версии 1.2.0 Введена.
С версии 4.5.0 Introduced the $post parameter.

Где вызывается хук

get_the_excerpt()
get_the_excerpt
WP_REST_Posts_Controller::prepare_item_for_response()
get_the_excerpt
WP_REST_Attachments_Controller::prepare_item_for_response()
get_the_excerpt
wp-includes/post-template.php 436
return apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );
wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php 2031
$excerpt = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );
wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php 1444
$caption = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );

Где используется хук в WordPress

wp-includes/default-filters.php 219
add_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10, 2 );