区块主题和 theme.json 为您提供了极大的灵活性,这可能让您觉得子主题似乎已经过时了。但在很多情况下,它们仍然必不可少。
如果您想真正掌控网站的设计,而无需修改父主题的核心文件,那么使用子主题仍然是正确的选择。
在本文中,我们将以 Twenty Twenty-Five 主题为基础,指导您创建一个具有自己的 style.css
和 functions.php
的区块子主题。您将学习如何安全地覆盖样式、定义自定义区块样式,甚至设置您自己的样式变体。这不仅仅是一个样式技巧,更是朝着构建您自己的完整区块主题迈出的坚实一步。
虽然这个练习看起来很简单,但我们将探讨一些可能会让您犯错的细节。让我们从创建自定义子主题开始,然后实现自定义样式变体。
注册区块级子主题
注册区块子主题比注册经典主题简单得多。
从技术上讲,您根本不需要注册它。当正确命名的子主题文件夹同时包含 theme.json
文件和 style.css
文件时,注册会自动进行。
那么,为什么 style.css
文件仍然必不可少呢?
与以前一样,它包含一个必需的标头(如下所示),其中包含 WordPress 用于识别主题的元数据,包括主题名称和它所扩展的父主题。虽然现在样式和设置都在 theme.json
中处理,但 style.css
仍然在 WordPress 识别您的主题方面发挥着关键作用,即使它不包含任何实际的 CSS。
/* Theme Name: Twenty Twenty-Five Child Description: Child theme for the Twenty Twenty-Five theme Template: twentytwentyfive */
除非您想要排队脚本或添加基于 PHP 的功能,否则 functions.php
文件不是必需的。我们稍后会讲解这些内容。
如果您不熟悉 theme.json
或想快速复习一下,请查看我们的指南“在 theme.json 中使用属性和键值对”。
对我们的子主题进行三项基本更改
首先,更新全局背景和文本颜色,并设置按钮区块的样式。
在子主题的 theme.json
文件(作为默认样式)中,我们定义以下内容:
{ "version": 3, "settings": { "color": { "palette": [ { "name": "Black", "slug": "black", "color": "#000000" }, { "name": "Yellow", "slug": "yellow", "color": "#FFFF00" }, { "name": "Purple", "slug": "purple", "color": "#800080" }, { "name": "White", "slug": "white", "color": "#FFFFFF" } ] } }, "styles": { "color": { "background": "var(--wp--preset--color--black)", "text": "var(--wp--preset--color--yellow)" }, "blocks": { "core/button": { "color": { "background": "var(--wp--preset--color--purple)", "text": "var(--wp--preset--color--white)" }, "border": { "color": "var(--wp--preset--color--yellow)", "width": "2px", "style": "solid" } } } } }
虽然背景和文本颜色适用于所有样式变化,但按钮区块样式仅适用于默认变化。
子主题在站点编辑器中使用默认样式变体。
覆盖样式变体
要在不同变体中应用相同的按钮样式,最好创建一个与父主题变体命名约定相匹配的 .json
文件。
例如,要覆盖 Evening 样式变体中的按钮边框,请在子主题的根目录(或 /styles
子文件夹内)创建一个名为 01-evening.json
的文件:
{ "version": 3, "title": "Evening", "styles": { "blocks": { "core/button": { "border": { "color": "var(--wp--preset--color--white)", "width": "3px", "style": "dashed" } } } } }
这里,我们使用了更宽的虚线边框来突出按钮。由于这些样式更具体,它们会覆盖 theme.json
中的通用样式。
注:无需重新定义全局背景或文本颜色——它们已经从子主题的 theme.json
中继承。
启用自定义晚间风格变化的子主题。
创建自定义样式变体
让我们更进一步,创建一个名为 Kinsta 的全新样式变体。此变体继承子主题的 theme.json
文件中的全局设置,并应用其自定义的调色板和按钮样式:
将以下内容保存为 /styles/kinsta.json
:
{ "version": 3, "title": "Kinsta", "settings": { "color": { "palette": [ { "name": "Primary", "slug": "primary", "color": "#261e1e" }, { "name": "Secondary", "slug": "secondary", "color": "#ff2900" }, { "name": "White", "slug": "white", "color": "#FFFFFF" } ] } }, "styles": { "color": { "background": "var(--wp--preset--color--secondary)", "text": "var(--wp--preset--color--primary)" }, "blocks": { "core/button": { "color": { "background": "var(--wp--preset--color--primary)", "text": "var(--wp--preset--color--white)" }, "border": { "color": "var(--wp--preset--color--white)", "width": "4px", "style": "dotted" } } } } }
这种“Kinsta”变体为我们提供了独特的外观,完全建立在子主题的结构内。
站点编辑器界面中突出显示了新的样式变体。
如何以及为何要将style.css添加到队列
在像 Twenty Twenty-Five 这样的真正的区块主题中,无需使用 PHP 手动为父主题或子主题添加样式表。WordPress 核心会根据 theme.json
文件动态生成 CSS。
但是,如果您想在 style.css
文件中编写自定义样式,则需要手动将其添加到队列。
注:样式的添加到队列没有一刀切的方法。这取决于父主题如何处理其自身的样式。对于 Twenty Twenty-Five,父主题和子主题的样式都必须手动添加到队列。
// Frontend styles add_action('wp_enqueue_scripts', function() { // Enqueue parent theme stylesheet wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); // Enqueue child theme stylesheet wp_enqueue_style( 'child-style', get_stylesheet_uri(), array('parent-style') ); });
此代码确保父主题和子主题的 style.css
文件均在前端加载。
注:这些更改仅适用于前端。编辑器样式仍然由 theme.json
控制。编辑器界面的样式设置不在本文讨论范围内。
要确认您的样式已正确入队,请尝试将以下 CSS 添加到子主题的 style.css
文件中:
body { color: #ffff00; background: #0000ff; }
这会为所有样式变体赋予蓝色背景和黄色文本颜色——仅在前端生效。
styles.css的一个简单用例
你可能会想:为什么要使用 CSS?theme.json
不是应该可以处理所有事情吗?
不完全是。
例如,theme.json
不支持 :hover
之类的伪类。要为所有按钮设置悬停效果,可以使用以下 CSS:
.wp-block-button a:hover { background: #ffffff; color: #0000ff; }
这适用于前端所有变体的所有按钮区块。
假设您想将此悬停效果限制在特定的变体或区块中。在这种情况下,您需要使用更高级的方法,例如条件主体类、区块过滤器或针对特定区块的 CSS。
添加区块样式变体
现在,让我们来看看如何使用 PHP 和 CSS 向按钮区块添加新的样式变体。
如果您考虑向 theme.json
添加 variations
数组,则不适用于此用例。虽然 theme.json
可以处理全局和区块样式,但区块样式变体(例如替代按钮样式)需要以不同的方式注册。
我们创建了一个名为“Alternative Outline”的新样式变体,它与编辑器 UI 中的默认填充和轮廓样式一起显示,并在前端正确呈现。
在PHP中注册样式
将以下代码添加到您子主题的 functions.php
文件中。它在核心加载之后但在任何页面呈现之前注册样式:
// Register "Alternative Outline" button style add_action('init', function() { register_block_style( 'core/button', [ 'name' => 'alternative-outline', 'label' => __('Alternative Outline', 'twenty-twenty-five-child'), ] ); });
注:我们使用 __()
进行国际化,并将其与子主题的文本域进行命名空间设置。
将自定义样式添加到style.css
现在,在子主题的 style.css
文件中定义此变体的样式(包括 :hover
状态):
.wp-block-button.is-style-alternative-outline .wp-block-button__link { background-color: transparent; color: var(--wp--preset--color--yellow); border: 2px dotted var(--wp--preset--color--yellow); transition: all 0.7s ease-in-out; } .wp-block-button.is-style-alternative-outline .wp-block-button__link:hover { background-color: var(--wp--preset--color--yellow); color: var(--wp--preset--color--black); }
此处使用的颜色变量在您的 theme.json
调色板中定义,确保整个网站的一致性。
新的“Alternative Outline”按钮区块样式可在工具栏和侧边栏中查看。
使用JSON创建区块样式变体
从 WordPress 6.6 开始,您可以完全使用 JSON 注册核心区块样式变体,无需 PHP。
以下示例向“组”区块添加了一个名为“Purple Background”的新变体。该变体显示在编辑器侧边栏中,并带有样式预览:
在主题的 /styles/purple-background/
文件夹中创建一个名为 block.json
的文件:
{ "version": 3, "$schema": "https://schemas.wp.org/trunk/theme.json", "title": "Purple Background", "slug": "section-purple", "blockTypes": ["core/group"], "styles": { "border": { "radius": "20px" }, "color": { "background": "#800080", "text": "#eeeeee" }, "spacing": { "padding": { "top": "var(--wp--preset--spacing--50)", "right": "var(--wp--preset--spacing--50)", "bottom": "var(--wp--preset--spacing--50)", "left": "var(--wp--preset--spacing--50)" } } } }
Purple Background 变体出现在编辑器侧栏中,如下图所示:
在站点编辑器中组区块使用自定义样式变体。
如果您使用多种样式变体,建议将它们放在 /styles
子文件夹中。在本例中,文件路径为: /styles/purple-background/block.json
。
以下是您在使用 JSON 方法时需要考虑的一些注意事项:
- 此方法不需要 PHP,并且可以减轻页面负担,因为 WordPress 仅在需要时加载相关的 CSS。
- 由于我们正在使用 Twenty Twenty-Five 的子主题(该主题已经使用了
theme.json
和动态样式),因此无需手动将样式添加到队列中。 - 某些区块可能尚未通过 JSON 支持所有样式选项。如果担心向后兼容性,您可以选择使用
register_block_style()
添加 PHP 回退选项。
小结
区块主题提供了非凡的灵活性,为无数的开发可能性打开了大门。在本文中,我们的目标是向您介绍区块主题的子主题世界,并希望能够激发您将自己的想法变为现实。
我们还探讨了两种添加自定义核心区块样式变体的方法——一种使用 PHP 和 CSS,另一种仅使用 JSON。
正如您所想,我们介绍的每个示例都可能引出多种思路。WordPress 拥有丰富的选项,通常提供多种方法来解决同一个问题。
例如,您可以构建一个区块主题,使用 theme.json
进行设置,但完全依赖 style.css
进行样式设置,从而充分利用 CSS 的广泛功能。或者,您可以有条件地将样式加入队列,以便仅在使用特定变体时加载它们。
可能性无穷无尽!
评论留言