定义全局设置

Avatar of Ganesh Dahal
Ganesh Dahal

让我们学习一下 WordPress 块主题中的 theme.json 结构,并将其应用于文件的两个主要部分:设置和样式。这些数组是配置 WordPress 功能和主题 CSS 输出的“顶层”。

由 DigitalOcean 提供

DigitalOcean 拥有您在任何阶段发展中都需要支持您的增长的云计算服务。 立即开始,获得价值 200 美元的免费积分!

到目前为止,我们已经花了一些时间来熟悉 theme.json,它是所有 WordPress 块主题的基础。我们涵盖了与 JSON 语法相关的各种 JSON 数据类型和常用术语。

我们将在本文中继续学习这些知识。

WordPress 块主题 CSS 和样式设置指南

目录


我们所说的“顶层”是什么意思

我们讨论了 JSON 如何具有结构化的语法。我们可以在 theme.json 文件的基本轮廓中看到这一点

{
  "version": 2,
  "settings": {},
  "styles": {},
  "customTemplates": {},
  "templateParts": {}
}

基本轮廓中的每个对象都是文件的“顶层”。您可以将对象视为配置各种事物的部分。忽略 version,有四个顶层部分

  • settings: 这里我们定义 WordPress 预设和默认值;我们也可以在这里启用或禁用某些 WordPress 功能。
  • styles: 这里我们定义用于全局和块级主题样式的 CSS。
  • customTemplates: 这里我们注册新的自定义主题模板。它相当于在经典主题中添加一个新的 PHP 模板文件。
  • templateParts: 此部分包含可以包含在模板中的模块化部分。它相当于您通常在经典主题中看到的 parts 子文件夹。

我们大部分时间都花在了 settingsstyles 部分。两者都提供了一种方式来配置 WordPress 块主题的全局样式。因此,让我们看看每一个以及我们可用的各种自定义主题外观的选项。

设置部分 (settings)

同样,这里我们配置 WordPress 功能,有点像您在经典主题的 functions.php 文件中使用的 add_theme_support 函数

{
  "version": 2,
  "settings": {
    // etc.
  }
}

这与主题的全局样式有什么关系?一些 WordPress 功能会影响样式,例如用于填充、边距、颜色和字体的 UI 控件。如果不启用它们,就无法在网站编辑器中的全局样式 UI 中应用这些样式和其他样式。

简而言之:我们在这里定义的是 WordPress 用于向网站编辑器的全局样式设置添加主题支持的内容,这些设置在整个主题中使用。

支持的功能

WordPress 块编辑器手册 提供了一个表格,概述了我们在 settings 部分中可以启用的可用功能,并将它们与等效的 add_theme_support 函数参数进行比较。

Theme JSON 设置add_theme_support
color.customcustom-colors
color.paletteeditor-color-palette
color.gradientseditor-gradient-presets
spacing.paddingcustom-spacing
spacing.unitscustom-units
typography.lineHeightcustom-line-height
typography.fontSizeseditor-font-sizes
useRootPaddingAwareAlignmentsN/A

例如,您在经典主题中使用 add_theme_support 来禁用自定义字体大小

<?php
add_theme_support(disable-custom-font-sizes);

theme.json 中的等效项是 settings.typography.customFontSize 属性

{
  "version": 2,
  "settings": {
    "typography": {
      "customFontSize": false;
    }
  }
}

您可以想象,这些功能中还有嵌套功能。例如,如果我们添加了对 spacing 控件的支持,那么我们可以单独启用许多与 spacing 相关的功能

{
  "version": 2,
  "settings": {
    "spacing": {
      "margin": false,
      "padding": false,
      "blockGap": null,
      "units": [ "px", "em", "rem", "vh", "vw" ]
    },
  }
}

截至 WordPress 6.1,这些是可以在 theme.json 中配置的 settings 功能

查看完整表格
设置功能数据类型
borderradius布尔值
color布尔值
style布尔值
width布尔值
colorcustom布尔值
customDuotone布尔值
customGradient布尔值
duotone数组
gradients数组
link布尔值
palette数组
text布尔值
background布尔值
defaultGradients布尔值
defaultPalette布尔值
layoutcontentSize字符串
wideSize字符串
type字符串 (defaultconstrained)
spacingmargin布尔值
padding布尔值
blockGap字符串
units数组
typographycustomFontSize布尔值
lineHeight布尔值
dropCap布尔值
fontStyle布尔值
fontWeight布尔值
letterSpacing布尔值
textDecoration布尔值
textTransform布尔值
fontSizes数组
fontFamilies数组

有关于将 outlineborder 属性添加到全局样式面板的 正在进行的讨论。它们在正式采用之前包含在此表中。

appearanceTools 简写

我知道该表显示了许多功能。配置每个设置可能会很麻烦。这就是 appearanceTools 设置发挥作用的地方。

{
  "version": 2,
  "settings": {
    "appearanceTools": true
  }
}

将其设置为 true 将以下设置一次性启用

{
  "version": 2,
  "settings": {
    "border": {
      "color": true,
      "radius": true,
      "style": true,
      "width": true
    },
    "color": {
      "link": true
    }
    "spacing": {
      "margin": true,
      "padding": true,
      "blockGap": true,
    },
    "typography": {
      "lineHeight": true
    }
  }
}

您可以看到我们用这种方法可以节省多少行代码!但假设您想利用 appearanceTools,但要禁用其支持的功能中的一个或两个。您可以单独执行此操作以覆盖该特定设置

{
  "version": 2,
  "settings": {
    "appearanceTools": true,
    "border": {
      "radius": false
    }
  }
}

以下屏幕截图显示了将 appearanceTools 设置为 true 如何在全局样式 UI 中公开这些控件,该屏幕截图来自默认的 Twenty Twenty-Three 主题

The WordPress Site Editor.

Nick Diego 的 Learn WordPress 视频 详细解释了 appearanceTools 属性和全局样式界面。

填充感知对齐

此功能值得一提,因为它是在 WordPress 6.1 中作为许多其他功能的一部分发布的。它是设置两个 spacing 功能的另一种快捷方式。

所以,这

{
  "version": 2,
  "settings": {
    "useRootPaddingAwareAlignments": true
  }
}

…相当于这

{
  "version": 2,
  "settings": {
    "spacing": {
      "margin": true,
      "padding": true
    },
  }
}

useRootPaddingAwareAlignments 的真正好处在于它的名字。通过启用它,我们选择了一个功能,该功能在主题的 <body> 上定义全局填充,并允许块“超出”该填充并全宽,如果我们需要一个块跨越边缘到边缘。

查看我之前的文章 以获取有关填充感知对齐的详细概述。

配置预设值

预设 是全局样式功能使用的预定义值。更具体地说,它们定义了整个块主题使用的 CSS 自定义属性

所以,假设您正在定义块主题的默认调色板,并将黑色(#000000)添加到其中

{
  "version": 2,
  "settings": {
    "color": {
      "palette": [
        {
          "color": "#000000",
          "name": "Base",
          "slug": "base"
        }
      ]
    }
  }
}

在后台,名为 样式引擎 的东西会使用这些值来生成主题的 CSS 类和自定义属性。我在 之前的一篇文章 中介绍了样式引擎。

样式引擎是 WordPress 6.1 中的新 API,旨在使样式的生成方式和应用位置保持一致。换句话说,它将所有可能的样式来源集中到一起,并单独负责正确生成块样式。[…] 考虑到样式可以来自多个地方,拥有一个集中的样式 API 可能是最优雅的解决方案。

当样式引擎注意到我们的 styles 时,它会创建一组预设自定义属性。例如,上面的调色板示例?它会根据我们提供的信息生成一个基于 CSS 的自定义属性。

如果我们打开 DevTools 并检查 <body> 元素,我们会看到我们的自定义属性在那里

DevTools window showing CSS custom variables on the body element.

注意自定义属性名称是如何格式化的

--wp-preset--<feature>--<slug>: <value>

因此,回到我们最初定义黑色调色板的示例

"color": {
  "palette": [
    {
      "color": "#000000",
      "name": "Base",
      "slug": "Base"
    }
  ]
}

我们可以预期在 <body> 元素上找到此自定义属性

body {
  --wp--preset--color--base: #000000;
}

我们只关注了 settings.color 预设,但我们在 settings 部分定义的几乎所有值都会产生一个自定义属性

{
  "version": 2,
  "settings": {
    "spacing": {
      "spacingSizes": [
        {
          // Creates: --wp-preset--spacing--40: 1rem
          "slug": "40",
          "size": "1rem",
          "name": "Small"
        },
        // etc.
      ]
    }
  }
}

全局预设

现在我们知道如何在 theme.json 中定义预设值,您可能想知道哪些预设可用。下表概述了截至撰写本文时的可用预设以及它们生成的预设。

设置功能CSS 自定义属性CSS 类
colorduotoneN/AN/A
gradients--wp-preset--gradient--<preset-slug>.has-<preset-slug>-<preset-category>
palette--wp--preset--palette--<preset-slug>每个值三个类

.has-<preset-value>-color

.has-<preset-value>-background-color

.has-<preset-value>-border-color
spacingspacingScaleN/AN/A
spacingSizes--wp--preset--spacing--<preset-slug>.has-<preset-slug>-spacing
typographyfontSizes--wp--preset--font-size--<preset-slug>.has-<preset-slug>-font-size
fontFamilies--wp--preset--font-family--<preset-slug>.has-<preset-slug>-font-family

块预设

theme.json 中定义预设值时,我们可以获得更细粒度的控制。除了我们刚刚看到的全局预设之外,我们还可以在块级别定义预设。

假设我们有以下全局颜色预设

{
  "version": 2,
  "settings": {
    "color": {
      "palette": [
        {
          // --wp-preset--color--base: #ffffff
          "color": "#FFFFFF",
          "name": "Base",
          "slug": "base"
        },
        {
          // --wp-preset--color--contrast: #000000
          "color": "#000000",
          "name": "Contrast",
          "slug": "contrast"
        }
      ]
    }
  }
}

这些设置生成的自定义属性在整个主题中使用,包括块。因此,如果我们在块编辑器中向页面添加 分隔符块,它将在渲染时引用相同的调色板。

但是,我们可以使用专门针对分隔符块的调色板来覆盖该调色板(或全局 settings 中的任何其他调色板)

{
  "version": 2,
  "settings": {
    "color": {
      "palette": [ // etc. ]
    },
    "blocks": {
      "separator": {
        "color": {
          "palette": [
            {
              "color": "#F8A100",
              "name": "Orange",
              "slug": "orange"
            }
          ]
        }
      }
    }
  }
}

在此示例中,分隔符块的调色板使用单个橙色(#F8A100)颜色值覆盖了全局调色板。

自定义预设

您还可以为任何属性创建“自定义” CSS 自定义属性。除了我们迄今为止看到的 settings 功能之外,还有一个 custom 属性,我们可以在其中执行此操作。

{
  "version": 2,
  "settings": {
    "custom": {
      // etc.
    }
  }
}

样式引擎会将我们在其中定义的任何内容转换为 CSS 自定义属性,并使用 --wp--custom--<variable-name> 命名约定

--wp--custom--<variable-name>: <value>

您在 custom 中定义的值将转换为 CSS 自定义属性,并使用 --wp--custom--<variable-name> 命名约定。

以下是从默认 Twenty Twenty-Two 主题中直接提取的自定义设置的简化示例。其中包含 typography.font-sizetypography.line-height 的自定义设置

{
  "version": 2,
  "settings": {
    "custom": {
      "typography": {
        "font-size": {
          "huge": "clamp(2.25rem, 4vw, 2.75rem)",
          "gigantic": "clamp(2.75rem, 6vw, 3.25rem)",
          "colossal": "clamp(3.25rem, 8vw, 6.25rem)"
        },
        "line-height": {
          "tiny": 1.15,
          "small": 1.2,
          "medium": 1.4,
          "normal": 1.6
        }
      }
    }
  }
}

总结

我们了解了 theme.json 文件的 settings 部分的很多知识。我们介绍了可用的设置以及它们如何用于定义 WordPress 网站编辑器全局样式 UI 中使用的全局样式。从那里,我们了解了预设值,包括我们可以配置哪些预设值以及样式引擎如何将它们生成到 CSS 自定义属性中。

我们还没有介绍如何使用 theme.json 在块主题中定义 CSS 样式。这发生在另一个名为 styles 的顶级部分,它是本系列下一部分的重点。

WordPress 块主题 CSS 和样式设置指南