如何覆盖 Wordpress 的核心块保存功能?

How to override Wordpress's core block save function?

我想做的就是重写核心块的保存功能,以呈现具有不同 html 的前端。当我使用 Wordpress 5.3 时,我能够使用 php:

覆盖并使其成为一个动态块(我更喜欢)
register_block_type( 'core/file', array(
'render_callback' => 'custom_core_block_render_cb',));

但现在我已经更新到 Wordpress 5.6,Wordpress 通知说 "WP_Block_Type_Registry::register was called incorrectly. Block type "core/file" is already registered。 "

这条通知是否重要到我不能忽视它?如果不是,那么有没有一种方法可以解决它,而无需使用 blocks.registerBlockType 覆盖 javascript 侧的 save() 因为它所做的一切都会带来未来的问题并在未来打破障碍我需要进行更新(这真的让我很烦)。也宁愿不复制整个块。

您不应该尝试重新注册核心块。 WP核心块有一个过滤器来改变输出:render_block

过滤器如下: apply_filters( 'render_block', string $block_content, array $block )

用法如下:

// Two arguments
add_filter( 'render_block', 'so66910341_core_file_output', 10, 2 );

function so66910341_core_file_output( string $block_content, array $block ) {
    if ( $block['blockName'] === 'core/file' ) :
         // update the $block_content here
         $updated_content_markup = '<html stuff>';
         $updated_content_markup .= $block_content;
         $updated_content_markup .= '</closing html stuff>';
         
         return $updated_content_markup; // or whatever variable you use.
    endif;

    // Return the original block content if it's not a core/file block.
    return $block_content;
}

这是文档: https://developer.wordpress.org/reference/hooks/render_block/

更好的 Wordpress 5.5 解决方案 - 仅更改 render_callback

add_filter( 'register_block_type_args', 'custom_register_block_type_args', 10, 3 );
function custom_register_block_type_args( $args, $name ) {
    if( $name == 'core/file' ) {
        $args['render_callback'] = 'custom_core_block_render_cb';
    }
    return $args;
}