excerpt_remove_blocks

The timeline below displays how wordpress function excerpt_remove_blocks has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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;
}

WordPress Version: 5.9

/**
 * 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)
{
    $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;
}

WordPress Version: 5.8

/**
 * 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)
{
    $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 array $allowed_wrapper_blocks The list 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 array $allowed_blocks The list 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;
}

WordPress Version: .20

/**
 * 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)
{
    $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_blocks = array_merge($allowed_inner_blocks, array('core/columns'));
    /**
     * 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 array $allowed_blocks The list 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 ('core/columns' === $block['blockName']) {
                    $output .= _excerpt_render_inner_columns_blocks($block, $allowed_inner_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;
}

WordPress Version: 2.2

/**
 * 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)
{
    $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_blocks = array_merge($allowed_inner_blocks, array('core/columns'));
    /**
     * 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 4.4.0
     *
     * @param array $allowed_blocks The list 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 ('core/columns' === $block['blockName']) {
                    $output .= _excerpt_render_inner_columns_blocks($block, $allowed_inner_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;
}

WordPress Version: .10

/**
 * 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)
{
    $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_blocks = array_merge($allowed_inner_blocks, array('core/columns'));
    /**
     * 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 array $allowed_blocks The list 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 ('core/columns' === $block['blockName']) {
                    $output .= _excerpt_render_inner_columns_blocks($block, $allowed_inner_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;
}

WordPress Version: 5.2

/**
 * 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)
{
    $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_blocks = array_merge($allowed_inner_blocks, array('core/columns'));
    /**
     * 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 4.4.0
     *
     * @param array $allowed_blocks The list 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 ('core/columns' === $block['blockName']) {
                    $output .= _excerpt_render_inner_columns_blocks($block, $allowed_inner_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;
}

WordPress Version: 5.0

/**
 * 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)
{
    $allowed_blocks = array(
        // Classic blocks have their blockName set to null.
        null,
        'core/columns',
        'core/freeform',
        'core/heading',
        'core/html',
        'core/list',
        'core/media-text',
        'core/paragraph',
        'core/preformatted',
        'core/pullquote',
        'core/quote',
        'core/table',
        'core/verse',
    );
    /**
     * 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 4.4.0
     *
     * @param array $allowed_blocks The list 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)) {
            $output .= render_block($block);
        }
    }
    return $output;
}