插件API钩子

WordPress 提供了许多钩子,允许插件“接入”WordPress 的功能。

你的主题应支持这些钩子,以便插件开发者能够扩展你的主题。

在本课中,你将学习如何通过实现特定的模板标签,让插件能够接入你的主题。

关于块主题的说明

如果你正在开发块主题,则无需担心实现这些模板标签。

实现本课所述功能的块已经支持相关的钩子。

只有在开发经典主题或核心块之外的自定义功能时,才需要使用这些模板标签。

模板标签

大多数钩子由WordPress内部自动执行,因此你的主题无需特殊标签即可使其工作。

然而,少数钩子需要在特定的主题模板中得到支持。

这些钩子由特定的模板标签触发:

wp_head() 触发 wp_head 动作,插件利用它向主题的 <head> 部分添加代码。

此标签应始终位于主题 header.php 模板文件中 <head> 元素的末尾。

wp_body_open() 触发 wp_body_open 动作,插件利用它向主题的 <body> 元素添加代码。

此标签应位于主题 header.php 模板文件中 <body> 元素的开头。

wp_footer() 触发 wp_footer 动作,插件利用它向主题的页脚添加代码。

此标签应位于主题的 footer.php 文件中,紧接在闭合的 </body> 标签之前。

wp_meta() 触发 wp_meta 动作。此动作可能有多种用途,具体取决于你的使用方式,但其中一个用途可能是允许主题切换。

此标签通常位于主题菜单或侧边栏的 <li>Meta</li> 部分。

comment_form() 用于在文章末尾显示评论表单。

此标签应位于 comments.php 模板文件中,直接放在文件闭合的 </div> 标签之前。

构建流程

在开发 WordPress 主题时,考虑是否需要构建流程来帮助你管理主题资源并优化性能会很有用。

在本课中,你将学习更多关于构建流程的知识、为何要使用它们,以及如何使用 @wordpress/scripts 包来设置一个基本的构建流程。

什么是构建流程?

构建流程是一种将源代码文件转换为计算机可读取的最终构建/生产版本的方法。

特别是,主题通常会将源代码压缩或转换为 CSS 或 JavaScript,以便浏览器能够读取。

为什么要使用构建流程?

根据你在主题中使用的技术,你可能需要一个构建流程来帮助你管理主题资源并优化性能。

例如,如果你选择使用 Sass 来编写样式,你将需要一个构建流程来将你的 Sass 文件编译成浏览器可读取的 CSS 文件。

如果你选择使用更现代的语法编写 JavaScript,你将需要一个构建流程来将你的 JavaScript 文件转译成所有浏览器都能执行的格式。

即使你不使用这些选项,构建流程对于优化主题资源仍然很有用,例如压缩 CSS 和 JavaScript 文件以及优化图片。

在创建 WordPress 主题时,你可能会发现自己需要一个构建流程来处理更复杂的项目。有很多系统可供选择,你可以使用任何你喜欢的。

WordPress 也提供了 @wordpress/scripts 包,你可以放心它会持续更新,并且应该能满足你大部分的需求。

前置要求

大多数 WordPress 主题开发不需要任何额外的软件。你只需要一个代码编辑器、一个本地开发环境和一个 WordPress 安装。

但要使用构建流程,还有一些其他要求:

  • 你需要在本地机器上安装 Node.js 和 npm,这也是构建 WordPress 区块的要求。
  • 建议对 webpack 有基本的了解。
  • 对 @wordpress/scripts 包有一定熟悉度。

这些工具比通常构建主题所需的工具更高级,但如果你想使用标准的 WordPress 构建流程,它们是必需的。

如果你已经完成了初级开发者学习路径中的区块开发入门模块,你应该已经具备了所有需要的知识。

设置文件和文件夹

@wordpress/scripts 包最初是为区块开发创建的。随着时间的推移,它已经发展到也能与主题一起使用。

默认情况下,它期望开发文件位于 /src 文件夹中,并将构建文件输出到 /build 文件夹。

然而,大多数主题作者会使用自定义系统来处理资源。

假设你的主题有以下结构:

your-theme/
├── resources/
│   ├── js/
│   └── scss/
├── public/
│   ├── js/
│   └── css/
├── style.css
└── functions.php

你的开发 JavaScript 和 Sass 文件分别位于 resources/jsresources/scss 文件夹中。当构建流程运行时,你希望它们被输出到 public/jspublic/css 文件夹。

设置 package.json 文件

第一步,如果你还没有做的话,是初始化 npm 项目。这将在你的主题根目录中创建一个 package.json 文件。

为此,打开你的终端,导航到主题根目录,并运行以下命令:

npm init

系统会提示你输入一些关于项目的信息。你可以按回车接受默认值,或根据自己的喜好更改这些值。

完成设置后,你的主题根目录中会有一个 package.json 文件。

{
  "name": "your-theme",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

接下来,你需要将 @wordpress/scripts 包作为开发依赖项安装。

为此,在终端中,在你的主题根目录下运行以下命令:

npm install @wordpress/scripts --save-dev

完成后,你会看到 package.json 文件已更新,包含了新的依赖项。

{
  "name": "your-theme",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@wordpress/scripts": "^27.9.0"
  }
}

最后但同样重要的是,更新 package.json 文件中的 scripts 部分,包含以下内容:

{
  "scripts": {
    "start": "wp-scripts start --webpack-src-dir=resources --output-path=public",
    "build": "wp-scripts build --webpack-src-dir=resources --output-path=public"
  }
}

这会创建两个 npm 脚本命令,startbuild,它们将使用适合你主题的正确配置来运行 @wordpress/scripts 包。

在这种情况下,它会在 resources 文件夹中查找文件,并将它们输出到 public 文件夹。

如果你有不同的文件夹结构,可以调整 --webpack-src-dir--output-path 参数以匹配你的设置。

配置 webpack

@wordpress/scripts 包是基于 webpack 构建的。如果你在构建区块,所有配置都已经为你准备好了。

但是,由于你正在构建主题,你需要用自己的配置覆盖 @wordpress/scripts 包的一些默认配置。

为此,请在主题根目录中创建一个自定义的 webpack.config.js 文件。

// WordPress webpack config.
const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );

// Plugins.
const RemoveEmptyScriptsPlugin = require( 'webpack-remove-empty-scripts' );

// Utilities.
const path = require( 'path' );

// Add any new entry points by extending the webpack config.
module.exports = {
    ...defaultConfig,
    ...{
        entry: {
            'js/editor':  path.resolve( process.cwd(), 'resources/js',   'editor.js'   ),
            'css/screen': path.resolve( process.cwd(), 'resources/scss', 'screen.scss' ),
            'css/editor': path.resolve( process.cwd(), 'resources/scss', 'editor.scss' ),
        },
        plugins: [
            // Include WP's plugin config.
            ...defaultConfig.plugins,

            // Removes the empty `.js` files generated by webpack but
            // sets it after WP has generated its `*.asset.php` file.
            new RemoveEmptyScriptsPlugin( {
                stage: RemoveEmptyScriptsPlugin.STAGE_AFTER_PROCESS_PLUGINS
            } )
        ]
    }
};

自定义 webpack 配置可以在 WordPress 开发者手册高级主题部分的构建过程页面中的配置 webpack 章节找到。

这个配置文件为你的自定义 JavaScript 和 Sass 文件设置了入口点,并告诉 webpack 在哪里找到它们。

它还配置了 webpack-remove-empty-scripts,这样就不会有残留的 JavaScript 文件映射到你的 CSS。

运行构建过程

一切设置完成后,你现在可以运行构建过程了。

要启动开发服务器,请在终端中运行以下命令:

npm run start

这将启动开发服务器并监视你的文件变化。当你对 JavaScript 或 Sass 文件进行更改时,构建过程将自动重新编译它们。

要为生产环境构建主题,请在终端中运行以下命令:

npm run build

加载脚本和样式

在关于包含资源的课程中,你已经学会了如何在主题中加载脚本和样式。

当使用构建过程时,你需要加载编译后的文件,而不是源文件。

如果你打开 public/js 文件夹,你会看到构建过程创建了以下文件:

editor.js
editor.asset.php

资源文件返回一个 PHP 数组,其中包含一个依赖项数组和一个 editor.js 文件的版本号。

然后你可以使用这个数组在主题中加载脚本。

首先,使用相关的钩子并在 functions.php 文件中指定钩子回调函数

// Load editor scripts.
add_action( 'enqueue_block_editor_assets', 'themeslug_editor_assets' );

function themeslug_editor_assets() {

}

在钩子回调函数内部,包含资源文件

$script_asset = include get_theme_file_path( 'public/js/editor.asset.php'  );

最后,使用资源文件中的值加载脚本

    wp_enqueue_script(
        'themeslug-editor',
        get_theme_file_uri( 'public/js/editor.js' ),
        $script_asset['dependencies'],
        $script_asset['version'],
        true
    );

你的最终代码应该如下所示:

add_action( 'enqueue_block_editor_assets', 'themeslug_editor_assets' );
function themeslug_editor_assets() {
    $script_asset = include get_theme_file_path( 'public/js/editor.asset.php'  );
    wp_enqueue_script(
        'themeslug-editor',
        get_theme_file_uri( 'public/js/editor.js' ),
        $script_asset['dependencies'],
        $script_asset['version'],
        true
    );
}

对于任何你想要加载的样式表,过程是类似的。

进一步阅读

关于如何使用 @wordpress/scripts 包 设置构建过程的完整指南,你可以参考 WordPress 开发者手册高级主题部分的构建过程页面。

主题中的JavaScript

JavaScript 是一种编程语言,用于为网页添加交互功能。

主题开发者通常使用 JavaScript 来为他们的主题提供交互性、动画或其他增强功能。

虽然使用 JavaScript 可以让你的主题更具吸引力和互动性,但如果使用不当,也可能带来潜在问题。

在本课中,你将学习在 WordPress 主题中使用 JavaScript 的一些最佳实践。

你将了解如何使用第三方 JavaScript 库、编写 JavaScript 时应遵循的一些最佳实践、是否应该使用 jQuery,以及在哪里可以找到更多信息。

JavaScript 库

如果你需要在主题中使用任何第三方 JavaScript 库,请务必检查该库是否已通过 WordPress 安装提供。

WordPress 包含多个你可以使用的 JavaScript 库。这些库随 WordPress 一起提供,你可以在主题中使用它们。

新手主题开发者常犯的一个错误是将自己的库版本与主题捆绑在一起。

然而,这可能会与那些加载 WordPress 自带库版本的插件产生冲突。

你可以在 wp_enqueue_scripts 函数参考中找到 WordPress 包含和注册的默认脚本和 JavaScript 库的完整列表。

确保你的主题与你喜欢的、WordPress 自带的库版本兼容。

编写 JavaScript

JavaScript 在网络上越来越受欢迎,多年来这门语言已经改进,能够执行各种任务。这意味着对于更常见的任务,你可能根本不需要使用 JavaScript 库,只需编写纯 JavaScript 即可。

以下是编写 JavaScript 时需要考虑的一些事项:

  1. 尽量避免使用全局变量。

全局变量在整个代码中都是可用的,无论作用域如何。这意味着你可以从代码的任何位置访问和修改这些变量,无论是在函数内部还是外部。

// 避免这样做
var myGlobal = 'Hello';

function myFunction() {
    console.log(myGlobal);
}

为了避免使用全局变量,你可以使用多种替代方法,但最直接的方法是使用立即调用函数表达式(IIFE)。这允许你在局部作用域中定义变量,防止它们污染全局命名空间。

(function() {
    var myLocal = 'Hello';
    console.log(myLocal);
})();
  1. 保持你的 JavaScript 不引人注目

确保你的 JavaScript 不会干扰页面内容或产生不必要的错误。这意味着你的 JavaScript 应该与 HTML 分离,并且不应依赖于 HTML 中的特定元素或类。

例如,如果你需要为按钮添加点击事件,你应该使用 addEventListener() 方法来添加事件监听器,而不是在 HTML 中使用 onclick 属性。此外,在添加事件监听器之前,你应该检查该元素是否存在于页面上。

// 好的做法
var button = document.getElementById('myButton');
if (button) {
    button.addEventListener('click', function() {
        console.log('Button clicked');
    });
}
  1. 使用编码标准。

使用编码标准有助于确保你的代码一致且易于阅读。WordPress 有一个 JavaScript 编码标准,你可以使用它来确保你的代码与 WordPress 代码库的其他部分保持一致。

  1. 验证并检查你的代码

使用 linter 检查你的代码是否存在错误和潜在问题。这有助于及早发现错误,并确保你的代码一致且易于阅读。

ESLint 是一个流行的 JavaScript linter,可用于检查你的代码是否存在错误和潜在问题。你可以通过 @wordpress/scripts 包配置你的主题,使用 ESLint 检查你的 JavaScript 代码。

  1. 确保你的主题在没有 JavaScript 的情况下也能工作

首先确保你的网站主题在没有 JavaScript 的情况下也能工作——然后添加 JavaScript 以提供额外的功能。这是一种渐进增强的形式,这种策略强调网页内容优先,允许每个人访问网页的基本内容和功能。

  1. 资源加载

对非立即需要的资源使用懒加载。为此,请识别对内容不关键的资源,并仅在需要时加载它们。

jQuery

jQuery 是一个 JavaScript 库,在 Web 开发的早期阶段使用率有所增加。然而,随着 JavaScript 的改进,对于许多常见任务,通常不再需要使用 jQuery。

如果不需要,就不要使用 jQuery——你可能不需要 jQuery 是一个很棒的网站,它向你展示了如何使用纯 JavaScript 完成许多常见任务。

例如,如果你需要按 ID 选择一个元素,你可以在纯 JavaScript 中使用 document.getElementById() 方法。

// 使用纯 JavaScript 选择元素
var element = document.getElementById('myElement');

另一个很好的例子是,如果你需要发起 AJAX 请求,可以使用纯 JavaScript 中的 fetch() 方法,或者更好的选择是使用 WordPress 的 apiFetch 包。

// jQuery
$.ajax({
  url: 'https://example.com/wp-json/wp/v2/posts',
  success: function( data ) {
      console.log( data );
  }
});

// Plain JavaScript
fetch('https://example.com/wp-json/wp/v2/posts')
  .then(data => console.log(data));

// apiFetch
apiFetch( { path: '/wp/v2/posts' } ).then( posts => {
    console.log( posts );
} );

如果你必须在主题中使用 jQuery,你应该使用 WordPress 自带的 jQuery 版本。

在加载主题的脚本时,你应该将 jQuery 指定为依赖项,将其包含在依赖数组中。

add_action( 'wp_enqueue_scripts', 'my_theme_scripts' );
function my_theme_scripts() {
    wp_enqueue_script( 
        'my-script', 
        get_template_directory_uri() . '/js/my-script.js', 
        array( 'jquery' ), 
        '1.0', 
        true 
    );
}

这将确保 jQuery 在你的脚本加载之前被加载,并且使用 WordPress 自带的版本。

由于 WordPress 自带的 jQuery 以 noConflict() 模式加载,你还应该将代码包裹在一个立即调用函数表达式(IIFE)中。

( function( $ ) {
    // Your jQuery code goes here
} )( jQuery );

这样可以防止其他 JavaScript 库使用 $ 变量与你的 jQuery 代码发生冲突。

进一步阅读

关于这些以及开发主题时的其他 JavaScript 最佳实践,请务必阅读 WordPress 开发者手册高级主题部分中的 JavaScript 最佳实践手册页面。

UI 最佳实践

在设计 WordPress 主题时,考虑主题的用户界面非常重要。

在本课中,你将学习用户界面设计,以及设计主题用户界面的一些最佳实践。

什么是用户界面设计?

网站的用户界面(UI)是人与网站之间进行交互的空间。这通常被称为网站前端。

良好的用户界面设计的目标是实现有效的交互,也就是良好的用户体验,这样网站就能提供有助于用户决策过程的良好反馈。

糟糕的用户界面设计可能导致令人沮丧的用户体验,并可能流失网站访客,这对你的主题用户来说不是一个好结果。

在设计主题时,确保主题元素提供良好的用户体验非常重要。

让我们深入了解设计 WordPress 主题用户界面的一些最佳实践。

Logo 链接到首页

主题的 Logo 应链接到网站的首页。

如果你在经典主题中使用 custom_logo() 函数,或在区块主题中使用站点 Logo 区块,Logo 会自动链接到首页。

如果你使用任何类型的自定义头部,应确保 Logo 链接到首页。

以下是一个使用 home_url() 函数将 Logo 链接到首页的示例:

<a href="<?php echo esc_url( home_url( '/' ) ); ?>">
    <img src="<?php echo get_stylesheet_directory_uri(); ?>/logo.png" alt="<?php esc_attr_e( 'Home Page', 'textdmomain' );?>" />
</a>

描述性锚文本

在为主题中显示的内容创建链接时,请确保使用描述性锚文本。

锚文本是链接的可见文本。描述性锚文本应让读者了解点击链接时将执行的操作。

以下是一个糟糕的描述性锚文本示例:

The best way to learn WordPress is to start using it. To Download WordPress, <a href="https://wordpress.org/download/">click here</a>.

“点击这里”并不能很好地描述点击链接后会发生什么。

以下是编写锚文本的更好方式:

The best way to learn <a href="https://wordpress.yuannext.com/">WordPress</a> is to start using it. <a href="https://wordpress.org/download/">Download WordPress</a> to get started.

“下载 WordPress” 这个文本描述了点击链接后会发生什么。

为链接添加下划线样式

谈到链接,好的主题设计意味着保留链接的默认样式,即显示下划线。

有些设计师使用 CSS 禁用链接的下划线。然而,这样做会导致可用性和可访问性问题,因为从周围文本中识别超链接变得更加困难。

不同的链接颜色

在链接上使用颜色是一种视觉提示,表明文本是可点击的。

HTML 链接是少数具有状态的元素之一。两个主要状态是已访问和未访问。已访问表示用户已点击链接并访问了其指向的页面,未访问表示用户尚未点击该链接。

默认情况下,未访问的链接是蓝色,已访问的链接是紫色。

为这两种状态设置不同的颜色有助于用户识别他们之前访问过的页面。

此外,链接还有另外 3 种状态:

  • 悬停,当鼠标悬停在元素上时
  • 聚焦,类似于悬停,但适用于键盘用户
  • 激活,当用户正在点击链接时

由于悬停和聚焦具有相似的含义,有时设计师会给它们相同的样式。

然而,悬停和聚焦有不同的交互模式。

如果你选择微妙的悬停状态,你应该有一个更易识别的聚焦状态。

悬停在链接上是一种定向活动,用户知道他们在页面中的位置,只需要识别该位置是否可链接。

聚焦是一种非定向活动,用户需要发现他们的焦点在从上一个位置移动后到了哪里。

注意 Twenty Twenty-Four 主题中的菜单链接,当鼠标悬停时会添加下划线样式,但通过键盘切换焦点时则显示边框。

颜色对比度

颜色对比度指的是屏幕上两种颜色之间的差异。

例如,注意 Twenty Twenty-Four 主题中默认按钮样式具有深色背景和浅色文字。如果你将文字颜色改为深色,按钮将更难阅读。

WebAIM 是一个非营利性网络可访问性组织,它提供了一个颜色对比度计算器,帮助你确定网站设计中的对比度。

你可以输入背景色和前景色,查看对比度是否满足 Web 内容可访问性指南(WCAG)2.0 的要求。

WCAG 2.0 要求普通文本的对比度达到 4.5:1 才能符合 AA 级标准。

足够的字体大小

让你的文字易于阅读。

通过将文字设置得足够大,你可以提升网站的可用性,使内容更容易理解。14px 是最小的文字尺寸。

将标签与输入框关联

在使用接受输入的 HTML 元素时,请确保使用 for 属性将标签与输入框关联起来。

<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="John Smith" />

这样用户就可以点击标签,并将焦点聚焦到输入框上。

占位符文本

开发者经常在输入元素上使用占位符,向用户展示输入内容的示例。

<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="John Smith" />

当用户将光标放入输入框并开始输入时,占位符文本会消失。

然而,如果使用不当,占位符可能会成为用户体验和可访问性的噩梦。

因此,请确保正确使用占位符,或者干脆不用。

如果你决定使用占位符,请确保它提示的是输入框所需的数据类型,而不是替代输入框的标签。

描述性按钮

网络上充斥着含义不清的按钮。还记得你上次在登录表单上使用“确定”或“提交”按钮吗?

在按钮上选择更合适的词语可以让你的网站更易用。尝试使用 [动词] [名词] 的模式。例如“提交表单”,而不仅仅是“提交”。

这描述了用户点击按钮时会发生什么。

一个很好的例子是单篇文章模板中的评论表单,它使用了“发表评论”,而不仅仅是“提交”。

进一步阅读

如需了解主题开发过程中用户界面最佳实践的更多信息,请参考 WordPress 主题开发者手册高级主题部分中的 UI 最佳实践文档。

子主题

有时,您可能需要一种方法来修改或扩展现有主题,而无需更改主题的代码。

这就是子主题发挥作用的地方。

在本课中,您将了解什么是子主题、为什么应该使用它们,以及如何创建和使用子主题。

什么是子主题?

子主题是其父主题的扩展。

使用子主题允许您扩展或修改父主题的任何部分,而无需对父主题代码进行任何更改。

为了理解其工作原理,让我们看一个简化的例子。

为什么要使用子主题?

从 WordPress 主题仓库中安装并激活任意主题到您的本地 WordPress 环境中。

在这个例子中,默认主题 Twenty Twenty-Four 已被安装并激活。

假设您想要自定义主题的某些部分,例如页脚的布局和结构。

您更希望站点菜单位于左侧,而站点徽标、标题和标语位于右侧。

您还想更改页脚版权信息,使其引用您的公司名称并更新 URL。

实现此目的的一种方法是在站点编辑器中操作。

您可以找到并编辑页脚模板部分,并进行所需的更改。

将菜单移到左侧,站点徽标和标题移到右侧,并更新页脚版权信息。

但是,如果您想在不同的站点上重复使用这些相同的更改呢?您每次都必须手动在站点编辑器中进行这些更改。

当然,您也可以手动进行更改,方法是导航到页脚模板中使用的 Twenty Twenty-Four 页脚模式,并更改该模式的内容。

但如果主题有更新会发生什么?在主题更新期间,整个主题会被替换为更新版本,因此您对任何特定文件所做的任何更改都将丢失!

这就是子主题发挥作用的地方。

通过创建一个仅包含您所需特定更改的子主题,您可以激活该子主题,更改就会被应用。

如果将来父主题有任何更新(在本例中是 Twenty Twenty-Four),子主题中的修改仍然会被应用,并且更改将保持不变。

创建子主题

为了理解子主题的工作原理,创建一个您的第一个子主题是个好主意。

让我们使用上面的例子来创建您的第一个子主题。

wp-content/themes 目录中,创建一个名为 twentytwentyfourchild 的新空主题目录。

在该目录中,创建一个 style.css 文件。然后,将以下主题头部信息添加到该文件中

/**
 * Theme Name: Child theme of Twenty Twenty-Four
 * Template:   twentytwentyfour
 */

现在浏览到 WordPress 管理区域,并导航到主题页面。您应该会看到列出的新子主题。

现在激活该子主题。然后浏览到网站前端。

您会注意到网站看起来和之前完全一样。这是因为所有主题元素都继承自父主题。

子主题的工作原理

所有 WordPress 主题——除非它们特指是子主题——从技术上讲都是父主题。

子主题与父主题略有不同,因为它们在 style.css 文件中有一个特殊的主题头部字段,用于定义它们是哪个父主题的子主题。

这个头部字段是 Template 字段。该字段的值必须与父主题的文件夹名称(或别名)匹配,相对于 wp-content/themes 目录。

这有时也被称为主题的别名。

因此,在这个例子中,这个主题是 Twenty Twenty-Four 的子主题,因为它将 Template 字段定义为 twentytwentyfour

您现在可以做的就是选择要修改的父主题的特定部分。

例如,如果您只想修改页脚,您可以在子主题目录中创建一个新的 footer.html 文件,位置与父主题中的 footer.html 相对路径相同,然后对子主题的 footer.html 进行所需的更改。

生成子主题页脚的一种方法是在站点编辑器中对页脚模板进行所需的更改。

然后,切换到代码编辑器视图,复制代码,并将其粘贴到子主题的 footer.html 文件中。

激活子主题后,您对子主题中 footer.html 文件所做的更改将被应用,并且页脚将按您期望的方式显示。

值得注意的是,子主题不仅可以扩展父主题的模板,实际上几乎可以扩展父主题的每个部分。通过子主题,你可以扩展模板部分、样式、甚至自定义主题功能。

使用创建块主题功能

虽然可以手动创建子主题,但你也可以使用“创建块主题”插件,基于在站点编辑器中进行的修改来创建子主题。

为此,请激活 Twenty Twenty-Four 主题,并删除本课程前面创建的子主题。

然后,搜索、安装并激活“创建块主题”插件。

接下来,导航到站点编辑器,对页脚模板部分进行相同的修改。

对修改满意后,点击站点编辑器右上角的“创建块主题”图标,打开创建块主题选项。

选择“创建主题”,然后选择“创建子主题”。

为子主题命名,并可选地添加相关主题元数据。

然后点击“创建子主题”。

子主题将被创建,编辑器会重新加载。

如果导航到 WordPress 管理区域的主题页面,你会看到新的子主题已列出,并已安装和激活。

如果浏览前端页面,你会看到对页脚模板部分所做的修改已生效。

最后,如果你查看代码编辑器,会发现子主题文件已创建。

延伸阅读

有关子主题的更多信息,请参阅主题开发者手册中高级主题下的“子主题”页面。你还可以在主题开发者手册核心概念章节的“子主题头部字段”部分,了解更多关于子主题特定头部字段的内容。

主题与用户隐私

随着互联网的发展,用户隐私的保护方式也在不断演变。

在本课中,你将了解主题如何影响用户隐私,以及你可以采取哪些措施来确保你的主题尊重用户隐私。

互联网隐私

世界各地的各种法律法规规定了网站如何收集和使用个人数据。

这些法律要求公司和网站所有者透明地说明他们如何收集、使用和共享个人数据。

同时,它们也赋予个人更多权限和选择权,以决定自己的个人数据如何被收集、使用和共享。

在 4.9.6 版本中,WordPress 引入了多项与隐私相关的功能,主要是为了帮助网站所有者遵守欧盟的《通用数据保护条例》(GDPR)。

WordPress 4.9.6 引入的主要功能包括:设置隐私政策页面的选项、允许通过评论与网站互动的用户选择不捕获其个人信息,以及网站管理员可以更好地处理用户个人信息的工具。

在这些功能中,隐私政策页面和评论数据处理与主题开发者最为相关。

隐私政策页面

隐私政策页面功能允许网站所有者创建一个隐私政策页面,说明其网站如何收集、使用和共享个人数据。在新安装的 WordPress 中,此页面会自动以草稿状态创建。

网站所有者可以编辑并发布该页面,然后在设置 > 隐私下将其配置为隐私页面。

作为主题开发者,你可以通过提供从主题链接到隐私政策页面的方式来帮助网站所有者。

这可以通过在页脚添加隐私政策页面的链接,或在网站的主菜单中添加隐私政策链接来实现。

有几种方法可以向主题添加隐私政策链接。

你可以使用以下 PHP 函数:

  • get_privacy_policy_url():获取隐私政策页面的 URL。
  • the_privacy_policy_link():在适用时显示格式化的隐私政策页面链接。
  • get_the_privacy_policy_link():在适用时返回格式化的隐私政策页面链接。

例如,以下代码会在一个 div 中显示隐私政策链接:

<div class="privacy-policy-link">
    <?php the_privacy_policy_link(); ?>
</div>

目前,在站点编辑器中还没有用于添加隐私政策链接的核心区块。

但是,你可以创建一个包含隐私政策页面链接的自定义模式。

<!-- wp:paragraph -->
<p><a href="<?php echo esc_url( get_privacy_policy_url() ); ?>">隐私政策</a></p>
<!-- /wp:paragraph -->

然后,你可以将此模式包含在主题的可用区块模式中,供网站管理员在需要时添加。

评论数据

WordPress 文章允许访客发表评论。

此功能在区块主题中由评论表单区块处理,在经典主题中由 comment_form() 函数处理。

当没有特定网站账户的访客在文章上发表评论时,他们会被要求提供姓名、电子邮件和网站。

这些信息会以浏览器 cookie 的形式存储在评论者的浏览器中,目的有两个:

  1. 如果他们再次在网站上留下评论,其姓名、电子邮件和网站将自动填入相应字段。
  2. 如果他们的评论被保留以待审核,他们可以返回该文章并在审核通过前删除评论。

此 cookie 中存储的信息对于网站功能并非必需。因此,用户需要有权选择是否同意存储这些个人信息。

为此,WordPress 会在评论表单下方输出一个复选框,允许评论者选择是否同意将这些数据存储在 cookie 中。

此复选框默认处于未选中状态,因为选择加入是用户必须明确批准的操作。

幸运的是,这个新的复选框字段会自动添加到使用评论表单区块或 comment_form() 函数显示的评论表单中。

然而,作为主题开发者,测试你的主题以确保此复选框在评论表单显示的任何位置都能正确显示并按预期工作,这一点非常重要。

延伸阅读

有关用户隐私以及主题如何影响它的更多信息,请查看主题开发者手册高级主题下的隐私页面。

主题无障碍测试工具

无障碍测试是主题开发过程中至关重要的一环。

它确保安装了你的主题的网站,无论用户的能力如何,都能被所有人使用。

本课程将向你介绍一些用于测试主题无障碍性的工具和技巧。

测试、修复、重复

尽早并反复进行测试,有助于你在新组件或页面发布前发现潜在的无障碍违规问题。

让我们来看看一些测试主题的方法。

自动化测试

基于 Chromium 的浏览器在开发者工具中内置了 Google Lighthouse。
Lighthouse 也可以作为独立网页和 NPM 包使用。

Firefox 有无障碍检查器,Safari 提供了审核功能。

WebAIM 的 Wave 是一个适用于 Firefox 和基于 Chromium 浏览器的浏览器扩展。

Deque Systems 的 axe 是一套无障碍测试工具:包括浏览器扩展、Figma 插件、VS Code 扩展、代码检查器等。

Pa11y 是一个面向开发者的免费开源替代方案。

WordPress 插件 (1:13)

Sa11y、WP Tota11y 和 Editoria11y 是你可以安装的插件,用于测试 WordPress 网站上的无障碍问题。每个插件在无障碍检查方面的方法略有不同;因此,请全部测试一下,看看哪个适合你的需求。

最后,还有 Accessibility Checker,它可以在文章编辑器和前端工作,显示错误,并提供详细解释(包括相关代码片段)和可能的修复方法。

手动测试

此外,你还可以进行一些手动测试。

  1. 尝试仅使用键盘浏览你的主题——不要用鼠标。使用 tab 键在链接、按钮和表单字段之间导航。按 enterspace 键激活这些交互元素。
  2. 更改配色方案(通过浏览器的开发者工具),以确保在深色模式或高对比度模式下显示良好。
  3. 最后,使用你设备内置的语音控制功能或专门的屏幕阅读器软件浏览网站。这是首选——有时也是唯一的方式,因为许多视障人士都使用网络。

结论

将无障碍优先的开发方法与开发过程中正确的测试工具和技巧相结合,将有助于确保你创建的主题能够被网络上的所有人使用。

开发无障碍主题的最佳实践

如果你看过《什么是无障碍,以及为什么它很重要》这节课,你就会知道数字无障碍是一个广义术语,意味着确保尽可能多的人能够使用网络。

这涉及法律和商业层面的影响,但更重要的是,无障碍指南能保证每个人都能获得更好的浏览体验。

提供无障碍主题、插件或网站最简单的方法就是从一开始就考虑它。在规划阶段就将其纳入,并教育同事(和客户)。这样,你不仅能尽早发现错误,实际上还能预防许多错误。

在本课中,你将学习无障碍 HTML 的基础知识,以及如何将它们应用到你的 WordPress 主题中。

基础知识

HTML 既强大又易于访问。

自己试试看:打开你的代码编辑器,创建一个有效的 HTML 页面——正确标记了地标、标题、文本、按钮、链接、表单等。

如果你愿意,可以使用下面的代码。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My website</title>
</head>
<body>

<header>
    <h1>Welcome to My Website</h1>
    <nav>
        <ul>
            <li><a href="#home">Home</a>
            <li><a href="#about">About</a>
            <li><a href="#services">Services</a>
            <li><a href="#contact">Contact</a></li>
        </ul>
    </nav>
</header>

<main>
    <article id="home">
        <h2>Home</h2>
        <p>This is the home section where introductory content can be found.</p>
        <form name="Just a button">
            <button type="button">Click Me!</button>
        </form>
    </article>

    <article id="about">
        <h2>About</h2>
        <p>This section contains information about the website or the person/company behind it.<p><a href="https://example.com">Visit their full profile</a></p>
    </article>

    <article id="services">
        <h2>Services</h2>
        <p>Details about the services offered can be found here.</p>
    </article>

    <article id="contact">
        <h2>Contact</h2>
            <form action="#" method="post" name="contact" autocomplete="on">
                <fieldset>
                    <legend>Let's chat</legend>
                    <div><label for="name">Name:</label></div>
                    <div><input type="text" id="name"></div>
                    <div><label for="email">Email:</label></div>
                    <div><input type="email" id="email"></div>
                    <div><label for="message">Message:</label></div>
                    <div><textarea id="message" rows="4" cols="50" spellcheck="true"></textarea></div>
                    <div><input type="submit" value="Submit"></div>
                </fieldset>
            </form>
        </article>
</main>

<footer>
    <p>© 2024 My Website</p>
</footer>

</body>
</html>

现在,通过在线无障碍检查器(如 Web Accessibility Checker)运行这段代码,你会注意到它检测到零个无障碍问题。

问题通常出现在你添加样式、脚本或媒体资源之后。作为现代 WordPress 主题的开发者,这些正是你会用到的技术——基于 React 的区块、PHP 注入的模板,以及从 theme.json 编译而来的 CSS。

关键在于你在编码和设计时要时刻注意无障碍性。

让我们探讨一些开发者和设计师在创建自定义区块、模板和模板部件时可以采用的技巧和最佳实践。

语义化 HTML

不要用 <div> 元素包裹所有内容,而是利用 HTML 中具有语义意义的元素。

这将为你省去那些为了把轮子重新发明成矩形而采用的变通方法。

地标

地标是一种定义页面结构的方式。它们帮助屏幕阅读器更轻松地浏览内容。

例如,与其只定义一堆带有类的 div:

<div class="header">
    <h1>Welcome to My Website</h1>
</div>

<div class="nav">
    <ul>
        <li><a href="#home">Home</a>
        <li><a href="#about">About</a>
        <li><a href="#services">Services</a>
        <li><a href="#contact">Contact</a></li>
    </ul>
</div>

你可以为相关部分使用地标。

<header>
    <h1>Welcome to My Website</h1>
</header>

<nav>
    <ul>
        <li><a href="#home">Home</a>
        <li><a href="#about">About</a>
        <li><a href="#services">Services</a>
        <li><a href="#contact">Contact</a></li>
    </ul>
</nav>

如果你在站点编辑器中设计或构建主题,也可以在那里设置地标。

要将组、行和堆叠区块定义为内容分区元素,请选择该区块,打开区块设置,然后展开高级部分。

向下滚动,根据区块的功能和位置,将HTML 元素设置为 headermainsectionarticleasidefooter

标题

在模板中添加标题时,始终按正确顺序使用标题,从 H2 开始,依次递减到 H6

在站点编辑器中,点击文档概览 > 大纲,检查你是否跳过了某个级别,或者一切是否设置正确。

按钮与链接

在设计用户操作时,考虑以下关于使用按钮或链接的要点:

  • 如果你希望访客执行某个操作,请使用 button 元素。
  • 当你希望他们导航到另一个页面时,请使用 anchor 元素(<a>)。
  • 如果链接应该看起来像按钮,例如在落地页上的行动号召按钮,那么就用 CSS 来设置样式。

表单

如果你在主题中设计任何表单,请遵循以下指南:

始终将表单包裹在 form 元素中。

input 字段上,始终设置适当的类型和匹配的属性。例如,将输入类型定义为 tel,会在移动设备上显示数字键盘。

<code><input type="tel" name="phone" id="phone" required>

不要依赖占位符文本来告诉用户输入字段的用途,始终提供可访问的标签。

对任何搜索表单使用 search 元素。

在设计登录表单时,你可以使用 autocomplete 属性来帮助密码管理器填写表单。

<code><input type="password" autocomplete="current-password">

默认情况下,大多数浏览器会在元素获得焦点时显示焦点环。

如果你想更改这些焦点环的显示方式,请使用 :focus-visible 伪类,并且不要完全移除焦点环。

颜色

务必创建具有足够对比度的无障碍调色板。

在编辑模板时,当你设置的文本和背景颜色组合未能满足要求时,WordPress 会发出警告。

不要仅使用颜色来传达信息。例如,链接应通过颜色以外的其他方式标记,焦点状态也是如此。如有疑问,请参考默认的 HTML 链接和焦点样式,并遵循它们。

排版

使用相对单位(如 rem)设置合适的字体大小,尽量避免使用 px

将内容宽度限制在 50 到 70 个字符之间;字符单位或 ch 单位非常适合此用途。

根据字体大小使用适当的行间距。

尊重用户偏好

媒体查询是响应式设计的基石,有助于创造更好的用户体验。

某些媒体查询类型(如 prefers-color-schemeprefers-reduced-motion)明确以无障碍性为驱动,但还有 pointerhoverscripting 等类型,可根据用户设备调整组件的行为。

ARIA 的变通方法

ARIA 是 可访问的富互联网应用程序 框架的缩写,常被引用为一种快速让 HTML 内容对屏幕阅读器更友好的方法。

然而,ARIA 最重要的规则是:只有在绝对必要时才使用它。理想情况下,你应该始终使用 HTML 功能来提供屏幕阅读器所需的语义,以便向用户说明正在发生什么。

误用的 aria 属性会使事情变得更不无障碍,因此除非你无法控制 HTML 或需要处理动态生成的内容,否则请避免使用它们。

有关更多信息,请务必访问 MDN 的 WAI-ARIA 基础知识部分。

总结与进一步阅读

无障碍性是一项永无止境的工作。即使是一个小小的改进,也能为你的网站访客带来巨大变化,而且它没有任何负面影响。它绝不会让他们的体验变得更糟。

要了解更多信息,请访问 W3C 网络无障碍倡议(WAI)的教程部分。

将经典主题转换为区块主题

欢迎来到本课程,我们将探讨如何将经典主题转换为混合主题或完整的区块主题。

通过本课程,你将能够:

  • 描述转换经典主题的各种要求,
  • 区分混合主题和区块主题,以及
  • 列出将经典主题转换为区块主题所需的步骤。

转换经典主题

开始将经典主题转换为区块主题需要什么?

如果你选择不添加 theme.json(你将在上一课中学到),你需要查看使用 functions.php 文件添加主题支持的各种选项。

WordPress 仪表盘中快速说明一下,最终用户在外观设置中无法访问站点编辑器时,就会知道他们正在使用的是经典主题还是混合主题。

混合主题与区块主题

现在让我们看看混合主题和区块主题之间的区别。

首先来看一个经典主题。

这里的经典主题是 Twenty Twenty,如果我们打开一个示例页面,可以看到最终用户可以在排版设置下使用多个区块设置。

他们还可以通过选择自定义颜色或主题提供的颜色之一来更改文本和背景的颜色。

通过点击“插入器”,最终用户可以选择区块、模板和媒体。

模板下,他们可以访问主题自带的模板。

同样在小工具中,最终用户可以使用区块来构建他们的小工具。

混合主题本质上仍然是经典主题,但主题作者选择为区块模板部分等功能添加主题支持。

转换经典主题的步骤

现在让我们看看将经典主题转换为区块主题的步骤。

第一步是查看设置和样式。

你可以通过简单地在主题中添加 theme.json 来弥合经典主题和区块主题之间的差距。

你可以在本模块的上一课中了解更多相关信息。或者你也可以选择在 functions.php 中为区块添加主题支持。

下一步是查看编辑体验。

WordPress 核心为最终用户提供了许多选项,但这可能会让人不知所措。

我们刚刚看到,即使在模板下,也会向最终用户提供模板目录中可用的模板选项。你可以选择移除这些,只包含你希望最终用户为你的主题使用的模板。

这里的目标是开始减少样式表中的 CSS 数量,转而使用 theme.json。

这里有一篇很棒的博客文章可以启发你。它提供了 15 种方法来策划 WordPress 编辑体验。这篇文章可在 WordPress 开发者博客上找到,它首先介绍了如何使用 theme.json 来实现。但还有很多方法可以通过 JavaScript 或 PHP 来实现。

下一步是开始使用区块编辑器(现在简称为编辑器)来构建你的页面。你还没有访问站点编辑器的权限,因此无法使用站点编辑器开发 HTML 模板,但你可以使用编辑器构建页面。

最后一步是将站点编辑器添加到你的主题中,并开始使用站点编辑器构建所有模板,这基本上意味着你将不再使用 PHP 模板,而是用 HTML 模板替换它们。

你不需要将经典主题转换为区块主题。你可以在混合主题阶段停下来,并根据预算做出决定。

如果你有兴趣将经典主题转换为混合主题,你可能希望首先在 functions.php 中添加对区块模板部分的支持。

请查看 Learn WordPress 上提供的相关教程,了解如何操作。

经典主题中的theme.json

欢迎来到本课,我们将探讨在经典主题中添加 theme.json 文件这一选项。

通过本课,你将能够:

  • 列出在经典主题中添加 theme.json 的好处,以及
  • 描述在经典主题中添加 theme.json 的过程。

在经典主题中添加 theme.json 有哪些好处?

这里我们以 Twenty Twenty-One 作为当前激活的主题。我们将通过打开一个页面来查看终端用户可用的部分设置和样式。我们来打开示例页面。

如果我们选择一个区块,然后转到右侧这里,我们会看到文本和排版设置及样式可用。通过 theme.json,我们可以控制这些设置和样式。

例如,你可以选择禁用标题区块的颜色支持。这里你看到的是为了禁用标题区块的颜色支持而添加到 theme.json 中的代码。

{
    "version": 2,
    "settings": {
        "blocks": {
            "core/heading": {
                "color": {
                    "background": false,
                    "text": false
                }
            }
        }
    }
}

添加 theme.json

现在让我们来看看如何将 theme.json 添加到经典主题中。我们将 theme.json 添加到 Twenty Twenty-One 主题中。我们只需要 schema 和版本号即可开始。

{
    "$schema": "https://schemas.wp.org/trunk/theme.json",
    "version": 2
}

要了解更多关于将 theme.json 添加到主题的信息,请查看《初学者 WordPress 开发者学习路径》中的《全局设置和样式》课程。

如果我们现在回到 WordPress 并重新加载页面,我们会看到布局发生了变化。这是因为 WordPress 自带的 theme.json 现在被激活了。

要解决这个问题,请回到 theme.json 并添加内容尺寸的设置。

添加 650px 并保存这些更改,然后回到 WordPress 并再次重新加载。

{
    "$schema": "https://schemas.wp.org/trunk/theme.json",
    "version": 2,
    "settings": {
        "layout": {
            "contentSize": "650px"
        }
    }
}

如果你想查看 WordPress 核心中 theme.json 的所有设置,可以在 ‘wp-includes/theme.json’ 文件夹中找到它。

后续步骤

如果你想了解更多关于 theme.json 的信息,可以查看 WordPress.org 上提供的区块编辑器手册。