WordPress Version: 6.4
/**
* Parses blocks out of a content string, and renders those appropriate for the excerpt.
*
* As the excerpt should be a small string of text relevant to the full post content,
* this function renders the blocks that are most likely to contain such text.
*
* @since 5.0.0
*
* @param string $content The content to parse.
* @return string The parsed and filtered content.
*/
function excerpt_remove_blocks($content)
{
if (!has_blocks($content)) {
return $content;
}
$allowed_inner_blocks = array(
// Classic blocks have their blockName set to null.
null,
'core/freeform',
'core/heading',
'core/html',
'core/list',
'core/media-text',
'core/paragraph',
'core/preformatted',
'core/pullquote',
'core/quote',
'core/table',
'core/verse',
);
$allowed_wrapper_blocks = array('core/columns', 'core/column', 'core/group');
/**
* Filters the list of blocks that can be used as wrapper blocks, allowing
* excerpts to be generated from the `innerBlocks` of these wrappers.
*
* @since 5.8.0
*
* @param string[] $allowed_wrapper_blocks The list of names of allowed wrapper blocks.
*/
$allowed_wrapper_blocks = apply_filters('excerpt_allowed_wrapper_blocks', $allowed_wrapper_blocks);
$allowed_blocks = array_merge($allowed_inner_blocks, $allowed_wrapper_blocks);
/**
* Filters the list of blocks that can contribute to the excerpt.
*
* If a dynamic block is added to this list, it must not generate another
* excerpt, as this will cause an infinite loop to occur.
*
* @since 5.0.0
*
* @param string[] $allowed_blocks The list of names of allowed blocks.
*/
$allowed_blocks = apply_filters('excerpt_allowed_blocks', $allowed_blocks);
$blocks = parse_blocks($content);
$output = '';
foreach ($blocks as $block) {
if (in_array($block['blockName'], $allowed_blocks, true)) {
if (!empty($block['innerBlocks'])) {
if (in_array($block['blockName'], $allowed_wrapper_blocks, true)) {
$output .= _excerpt_render_inner_blocks($block, $allowed_blocks);
continue;
}
// Skip the block if it has disallowed or nested inner blocks.
foreach ($block['innerBlocks'] as $inner_block) {
if (!in_array($inner_block['blockName'], $allowed_inner_blocks, true) || !empty($inner_block['innerBlocks'])) {
continue 2;
}
}
}
$output .= render_block($block);
}
}
return $output;
}