WordPress Version: 6.4
/**
* Generates an excerpt from the content, if needed.
*
* Returns a maximum of 55 words with an ellipsis appended if necessary.
*
* The 55-word limit can be modified by plugins/themes using the {@see 'excerpt_length'} filter
* The ' […]' string can be modified by plugins/themes using the {@see 'excerpt_more'} filter
*
* @since 1.5.0
* @since 5.2.0 Added the `$post` parameter.
* @since 6.3.0 Removes footnotes markup from the excerpt content.
*
* @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
* @param WP_Post|object|int $post Optional. WP_Post instance or Post ID/object. Default null.
* @return string The excerpt.
*/
function wp_trim_excerpt($text = '', $post = null)
{
$raw_excerpt = $text;
if ('' === trim($text)) {
$post = get_post($post);
$text = get_the_content('', false, $post);
$text = strip_shortcodes($text);
$text = excerpt_remove_blocks($text);
$text = excerpt_remove_footnotes($text);
/*
* Temporarily unhook wp_filter_content_tags() since any tags
* within the excerpt are stripped out. Modifying the tags here
* is wasteful and can lead to bugs in the image counting logic.
*/
$filter_image_removed = remove_filter('the_content', 'wp_filter_content_tags', 12);
/*
* Temporarily unhook do_blocks() since excerpt_remove_blocks( $text )
* handles block rendering needed for excerpt.
*/
$filter_block_removed = remove_filter('the_content', 'do_blocks', 9);
/** This filter is documented in wp-includes/post-template.php */
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
// Restore the original filter if removed.
if ($filter_block_removed) {
add_filter('the_content', 'do_blocks', 9);
}
/*
* Only restore the filter callback if it was removed above. The logic
* to unhook and restore only applies on the default priority of 10,
* which is generally used for the filter callback in WordPress core.
*/
if ($filter_image_removed) {
add_filter('the_content', 'wp_filter_content_tags', 12);
}
/* translators: Maximum number of words used in a post excerpt. */
$excerpt_length = (int) _x('55', 'excerpt_length');
/**
* Filters the maximum number of words in a post excerpt.
*
* @since 2.7.0
*
* @param int $number The maximum number of words. Default 55.
*/
$excerpt_length = (int) apply_filters('excerpt_length', $excerpt_length);
/**
* Filters the string in the "more" link displayed after a trimmed excerpt.
*
* @since 2.9.0
*
* @param string $more_string The string shown within the more link.
*/
$excerpt_more = apply_filters('excerpt_more', ' ' . '[…]');
$text = wp_trim_words($text, $excerpt_length, $excerpt_more);
}
/**
* Filters the trimmed excerpt string.
*
* @since 2.8.0
*
* @param string $text The trimmed text.
* @param string $raw_excerpt The text prior to trimming.
*/
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}