WordPress 区块样式变体完全指南

WordPress 区块编辑器(也就是古腾堡)提供了一套灵活的样式系统,让主题开发者能够为每个区块创建多种视觉变体。这篇文章会带你彻底搞懂“区块样式变体”这个概念——它不是全局样式变体,也不是区块变体,三者虽然名字相近,但用途完全不同。

你将学会两种注册方式:PHP 方式和 JavaScript 方式。还会了解到如何通过 theme.json 定制核心区块的预设样式,以及何时该用哪种方法。文章会解释每个术语,并提供可直接运行的代码示例,适合初学者跟着操作。


一、区块样式变体是什么?

“区块样式变体”的官方简称是“区块样式”,它本质上就是一个 CSS 类名,格式为 .is-style-{名称}。当你给一个区块应用某种样式时,这个类就会被添加到区块的外层容器上。

举个例子:你给「图片」区块选了一个“圆角”样式,实际上就是在该区块的包裹元素上加了一个 .is-style-rounded 类。剩下的工作交给 CSS——主题或插件提前写好的样式规则会生效。

关键限制:用户每次只能给一个区块选择一种样式,不能组合多个样式。如果你需要让用户能自由组合多种视觉效果,就得考虑开发自定义设计工具,而不是用区块样式。

注意:区块样式≠区块样式表(样式表是 CSS 文件本身)。两者常配合使用,但概念不同。


二、PHP 方式注册与移除

大多数主题开发者会用 PHP 来注册区块样式,因为直接在 functions.php 里写代码更直观。

register_block_style() 函数

这个函数接受两个参数:

php

register_block_style( 
    string $block_name,   // 区块名称,如 'core/image'
    array $style_properties // 样式配置数组
): bool

配置数组里必须包含 name 和 label,还可以选择是否提供 inline_style(内联 CSS)或 style_handle(外部样式表句柄)。

php

add_action( 'init', 'mytheme_register_block_styles' );

function mytheme_register_block_styles() {
    register_block_style( 'core/image', array(
        'name'         => 'hand-drawn',
        'label'        => __( '手绘风格', 'mytheme' ),
        'inline_style' => '.wp-block-image.is-style-hand-drawn img {
            border: 3px solid currentColor;
            border-radius: 255px 15px 225px 15px/15px 225px 15px 255px;
            box-shadow: 0 6px 16px rgba(0,0,0,0.25);
        }'
    ) );
}

如果 CSS 代码量较大,建议放到独立的样式表文件中,然后用 style_handle 参数引入。

注意:style_handle 参数目前存在一个已知问题——它只会在编辑器里加载样式,前台页面不会生效。在官方修复之前,建议暂时用 inline_style 或手动在 wp_enqueue_scripts 里加载样式表。

unregister_block_style() 函数

移除已注册的区块样式:

php

add_action( 'init', 'mytheme_unregister_block_styles', 99 );

function mytheme_unregister_block_styles() {
    unregister_block_style( 'core/image', 'hand-drawn' );
}

注意优先级设为 99,确保在注册函数(默认优先级 10)之后执行。PHP 方式注册的样式只能用 PHP 方式移除,不能用 JavaScript 移除。


三、JavaScript 方式注册与移除

如果你的主题需要在前端动态处理区块样式,或者你想用更现代的 JS 方式,可以使用 registerBlockStyle() 和 unregisterBlockStyle()。

加载 JavaScript 文件

先在主题目录下创建 assets/js/block-editor.js 文件,然后在 functions.php 中引入:

php

add_action( 'enqueue_block_editor_assets', 'mytheme_block_editor_assets' );

function mytheme_block_editor_assets() {
    wp_enqueue_script(
        'mytheme-block-editor',
        get_theme_file_uri( 'assets/js/block-editor.js' ),
        array( 'wp-blocks', 'wp-dom-ready', 'wp-edit-post' )
    );
}

registerBlockStyle() 用法

js

wp.blocks.registerBlockStyle( 'core/image', {
    name: 'hand-drawn',
    label: '手绘风格'
} );

和 PHP 版本一样,也支持 isDefault 参数,设为 true 时该样式会成为区块的默认样式。

CSS 样式需要通过其他方式引入,比如在 functions.php 中用 wp_add_inline_style(),或者单独加载一个 CSS 文件。

unregisterBlockStyle() 用法

为了保证移除操作在样式注册完成之后执行,建议放在 wp.domReady 回调里:

js

wp.domReady( function () {
    wp.blocks.unregisterBlockStyle( 'core/image', 'hand-drawn' );
} );

JavaScript 方式注册的样式只能用 JavaScript 方式移除。


四、通过 theme.json 定制核心区块样式

WordPress 允许你在 theme.json 里直接修改核心区块的预设样式,而不需要写任何 CSS。这种方式的优势在于:用户可以在“外观 > 编辑器 > 样式”界面中看到并调整这些样式。

实际案例:修改按钮的“轮廓”样式

假设你想让「按钮」区块的“轮廓”样式带上一个双层边框效果(用阴影模拟),可以这样配置 theme.json:

json

{
    "version": 2,
    "styles": {
        "blocks": {
            "core/button": {
                "variations": {
                    "outline": {
                        "border": {
                            "color": "var:preset|color|black",
                            "radius": "4px",
                            "style": "solid",
                            "width": "3px"
                        },
                        "shadow": "var:preset|shadow|outlined",
                        "spacing": {
                            "padding": {
                                "top": "0.5rem",
                                "bottom": "0.5rem",
                                "left": "1.5rem",
                                "right": "1.5rem"
                            }
                        }
                    }
                }
            }
        }
    }
}

可定制的核心区块样式列表

目前 WordPress 支持在 theme.json 中定制以下区块的预设样式:

  • core/button:outline、fill
  • core/image:rounded
  • core/quote:plain
  • core/site-logo:rounded
  • core/separator:wide、dots
  • core/social-links:logos-only、pill-shape
  • core/table:stripes
  • core/tag-cloud:outline

注意:通过 register_block_style() 自定义注册的区块样式,目前还不能在 theme.json 中定制。只能定制 WordPress 核心自带的那些样式。


总结

方法适用场景移除方式
PHP(register_block_style)主题开发的主流选择,直接写在 functions.php必须用 PHP
JavaScript(registerBlockStyle)需要动态处理或偏好前端开发方式必须用 JS
theme.json 定制仅限核心预设样式,无需写 CSS,用户可调节直接修改配置

建议优先考虑用 theme.json 定制核心样式——这是干净的方式。如果核心预设样式不满足需求,再用 PHP 或 JS 注册自定义样式。选择哪种注册方式,主要看你的开发习惯和主题架构,功能上没有本质区别。