加载CSS或JavaScript

由于插件不控制 WordPress 网站的外观和感觉,如果你需要使用自定义 CSS 或 JavaScript,你需要遵循一个称为“入队”的过程。

为了添加自定义 CSS 或 JavaScript,WordPress 插件需要一种方法,在任何时候将脚本或样式标签添加到正在渲染的 HTML 中。

幸运的是,WordPress 允许插件开发者将其插件的 CSS 或 JavaScript 入队,这样它就会被添加到任何文章或页面请求的 HTML 中的正确位置。

在本课中,你将学习如何在前端或管理仪表板上入队自定义 CSS 和 JavaScript。

入队 CSS

与大多数 WordPress 功能一样,首先你需要在特定钩子上注册一个回调函数,并使用该回调函数来入队你的脚本或样式。

要使用的正确钩子是 wp_enqueue_scripts 动作钩子。从文档中可以看到,尽管钩子名称如此,但它用于入队脚本和样式。

因此,首先在钩子上注册回调函数,并创建回调函数。

<?php
add_action( 'wp_enqueue_scripts', 'bookstore_enqueue_scripts' );

function bookstore_enqueue_scripts() {
    // 在这里入队脚本或样式
}

现在你可以入队自定义 CSS 或 JavaScript 了。

让我们针对前端任何给定书籍的标题,并将其变为红色。

继续在你的 bookstore 插件目录中创建一个空的 bookstore.css 文件,以便你的插件将其入队。

在该文件中,添加以下代码:

body.single-book h1 {
    color: red;
}

每当渲染单本书籍时,它都会将 single-book 类添加到 HTML 页面的 body 元素中,因此这段代码会将 body 标签内任何 h1 标签的颜色更改为红色。

现在你已经创建了 CSS 文件,需要在 bookstore_enqueue_scripts() 函数中将其入队。

你可以使用 wp_enqueue_style 函数来实现这一点。

至少,你需要向该函数传递前两个参数:

  • 句柄(handle),这是样式表的唯一名称,在样式表添加到 HTML 时使用
  • 源路径(src),即样式表的完整 URL,或相对于 WordPress 根目录的样式表路径。

对于插件,你可以使用 plugins_url 函数获取插件目录的 URL,然后将其与 CSS 文件的路径拼接起来。

<?php
function bookstore_enqueue_scripts() {
    wp_enqueue_style( 'bookstore', plugins_url( 'bookstore.css', __FILE__ ) );
}

WordPress 请求期间,这会将样式表句柄和 URL 添加到一个 wp_styles 对象中。

当生成要渲染的 HTML,并且 WordPress 准备输出 head 标签时,它会遍历 wp_styles 对象中的每个样式表,并输出一个 HTML 样式元素,将句柄作为元素的 id 属性,将源路径作为元素的 href 属性。

入队此 CSS 文件后,继续浏览你添加的任何书籍的单本书籍视图,你应该会注意到 h1 元素是红色的。

入队 JavaScript

你也可以使用相同的 wp_enqueue_scripts 动作钩子回调函数,从你的插件入队 JavaScript 文件。

唯一的区别是,你可以使用 wp_enqueue_script 而不是 wp_enqueue_style

wp_enqueue_style 类似,你需要向 wp_enqueue_script 传递唯一的句柄和源路径参数,以便它入队你的 JavaScript 文件。

首先,在 bookstore 目录中创建一个 bookstore.js 文件,并向其中添加一个简单的 JavaScript 警告框。

alert( 'Hello from Bookstore' );

现在,更新 bookstore_enqueue_scripts 函数,使用 wp_enqueue_script 入队 bookstore.js 文件。

<?php
function bookstore_enqueue_scripts() {
    wp_enqueue_style( 'bookstore', plugins_url( 'bookstore.css', __FILE__ ) );
    wp_enqueue_script( 'bookstore', plugins_url( 'bookstore.js', __FILE__ ) );
}

与样式表一样,wp_enqueue_script 会将脚本句柄和 URL 添加到一个 wp_scripts 对象中,并为每个脚本输出一个 HTML 脚本元素,在 id 属性中使用句柄,在 src 属性中使用 URL。

入队此脚本后,浏览你添加的任何书籍的单本书籍视图,你应该会看到页面上弹出警告框。

在管理仪表板上入队

你也可以在管理仪表板上入队样式和脚本,使用 admin_enqueue_scripts 动作钩子而不是 wp_enqueue_scripts 动作钩子。

<?php
add_action( 'admin_enqueue_scripts', 'bookstore_admin_enqueue_scripts' );

function bookstore_admin_enqueue_scripts() {
    // 在这里入队管理仪表板的脚本或样式
}

一旦你在钩子上注册了回调函数,入队脚本和样式的过程与前端相同,使用 wp_enqueue_stylewp_enqueue_script

选择性入队

在本课的示例中,bookstore CSS 和 JavaScript 在网站的每个页面上都被入队。这并不理想。例如,对于 CSS,它专门针对单本书籍视图上的 h1 元素,因此你不需要为除书籍之外的任何内容入队 CSS。

可以进行选择性入队,即你确定文件应该被入队的具体场景。

例如,在 bookstore.css 的情况下,你可以使用 WordPress 的 is_singular() 函数来检查当前渲染的内容是否为书籍自定义文章类型。

如果不是,则退出函数,不加载样式表或脚本文件。

add_action( 'wp_enqueue_scripts', 'bookstore_enqueue_scripts' );
function bookstore_enqueue_scripts() {
    if ( ! is_singular( 'book' ) ) {
        return;
    }
    wp_enqueue_style(
        'bookstore-style',
        plugins_url() . '/bookstore/bookstore.css'
    );
    wp_enqueue_script(
        'bookstore-script',
        plugins_url() . '/bookstore/bookstore.js'
    );
}

还有其他多种方法可以确保你的插件样式表或脚本文件仅在需要时加载。这样做意味着你的插件不会给任何安装了它的 WordPress 站点增加不必要的开销或加载时间。

自定义文章类型数据

有时候,默认的自定义文章类型字段可能不够用,你需要在一个自定义文章类型上存储额外的数据。

幸运的是,WordPress 支持一种叫做文章元数据的功能,它允许你存储关于文章的额外信息。

让我们看看如何在一篇文章或自定义文章类型上使用文章元数据。

什么是文章元数据

文章元数据是一种在 WordPress 数据库中存储文章额外信息的方式。

文章元数据以键值对的形式存储在 postmeta 表中。如果你查看 WordPress 数据库中的 postmeta 表,你会看到它有四个列:meta_idpost_idmeta_keymeta_value

post_id 是元数据关联的文章的 ID。meta_key 是元数据字段的名称,meta_value 是它的值。

添加文章元数据

你可以使用 add_post_meta 函数向文章添加文章元数据。这个函数接受三个参数:文章的 ID、元数据的名称和元数据的值。

假设你想向 ID 为 1 的文章添加一个文章元数据字段,并且你想将文章撰写地点存储为 London

你可以使用以下代码:

<?php add_post_meta( 1, 'location', 'London' ); ?>

还有其他用于处理文章元数据的函数,例如 update_post_metadelete_post_metaget_post_meta

你可以在插件开发者手册的元数据页面中阅读更多关于这些函数以及如何在插件中使用它们的内容。

自定义字段面板

通过代码添加文章元数据是一种方式,但也可以让站点管理员通过 WordPress 管理界面添加文章元数据。

其中一种方法是使用文章类型的自定义字段面板。

要启用自定义字段面板,你首先需要确保你的自定义文章类型支持元数据。

为此,你需要添加或更新 supports 参数,以包含对 custom-fields 的支持。

然后,在编辑自定义文章类型时,点击编辑器的选项图标,选择偏好设置,点击面板,并启用自定义字段开关。

这将刷新编辑器,你会在屏幕底部看到自定义字段面板。

在这里,你可以添加一个新的自定义字段,并为其指定名称和值。

例如,如果你想添加一本书的 ISBN 号,你可以添加一个名为 isbn 的自定义字段,并将值设为 ISBN 号。

这个面板使用 add_post_meta 函数将元数据添加到文章中。

为自定义字段面板预填充字段名称

也可以使用预定义的元字段列表来填充自定义字段面板的名称字段。

为此,你需要挂钩到 postmeta_form_keys 过滤器,并添加你想要在自定义字段面板中显示的元字段名称。

postmeta_form_keys 过滤器在自定义字段面板的 HTML 渲染之前触发,并传递两个参数:一个元键数组和文章对象。

如果没有定义其他键,则会执行一个查询来获取文章任何现有元数据的键。

因此,通过更新元键数组,你可以将元字段键添加到自定义字段面板,从而使用户更容易添加正确的元数据。

以下是一个如何实现此操作的示例:

add_filter( 'postmeta_form_keys', 'add_isbn_to_custom_fields', 10, 2 );

function add_isbn_to_custom_fields( $keys, $post ) {
    if ( 'book' === $post->post_type ) {
        $keys[] = 'isbn';
    }
    return $keys;
}

你将一个回调函数注册到 postmeta_form_keys 过滤器上,并将接受的参数设置为 2,以接受过滤器中的两个参数。

然后,检查文章类型是否为 book,如果是,则将 isbn 选项添加到 $keys 数组中,然后返回该数组。

如果文章类型是 book,它就会将 isbn 元字段添加到自定义字段面板中。

如果你创建或编辑一本 book,并且启用了自定义字段面板,你会看到 isbn 字段可用于向文章添加元数据。

自定义元数据框

另一种允许站点管理员添加文章元数据的方法是使用自定义元数据框。

然而,使用自定义元数据框还需要充分理解安全开发的原则,但现在你可以在插件开发者手册的自定义元数据框页面中阅读相关内容。

你将在插件开发者学习路径中学习如何使用元数据框。

自定义分类法

在 WordPress 中,分类法是一种将内容分组的方式。在默认的 WordPress 安装中,有两种已注册的分类法:分类目录和标签。

当开发一个注册自定义文章类型的插件时,你也可以注册自定义分类法。

这为你的插件增加了额外的灵活性,因为它允许你的自定义文章类型独立于默认的分类目录或标签进行分组。

让我们看看这是如何工作的,以及你需要做什么来注册一个自定义分类法。

为什么要使用自定义分类法?

你可能会认为 WordPress 自带的两种自定义分类法已经足够,但有时你的插件可能需要以不同的方式对数据进行分组。

例如,在一个书店中,你可能希望按类型对书籍进行分组,比如小说、非小说、科幻小说等。

此外,当你为特定文章类型注册自定义分类法时,该分类法将仅对该文章类型可用,并会在管理菜单和编辑界面中与该文章类型关联显示。

注册自定义分类法

让我们为你之前课程中构建的书店插件添加一个自定义分类法:

<?php
/**
 * 插件名称:书店
 * 描述:一个管理书籍的插件
 * 版本:1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // 如果直接访问则退出
}

add_action( 'init', 'bookstore_register_book_post_type' );
function bookstore_register_book_post_type() {
    $args = array(
        'labels' => array(
            'name' => '书籍',
            'singular_name' => '书籍',
        ),
        'public' => true,
        'has_archive' => true,
        'show_in_rest' => true,
        'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields' ),
    );

    register_post_type( 'book', $args );
}

要注册自定义分类法,你可以使用 register_taxonomy 函数,其方式与 register_post_type 函数类似。

这个函数要求你传入分类法的名称、分类法关联的文章类型以及一个参数数组。

register_post_type 函数类似,register_taxonomy 函数也需要挂载到 init 动作上。

所以首先注册该动作的回调函数。

add_action( 'init', 'bookstore_register_genre_taxonomy' );

然后,你可以创建 bookstore_register_genre_taxonomy 回调函数。

在这个函数中,创建参数数组,并调用 register_taxonomy 函数,传入相关参数来创建分类法。

function bookstore_register_genre_taxonomy() {
    $args = array(
        'labels'       => array(
            'name'          => '类型',
            'singular_name' => '类型',
            'edit_item'     => '编辑类型',
            'update_item'   => '更新类型',
            'add_new_item'  => '添加新类型',
            'new_item_name' => '新类型名称',
            'menu_name'     => '类型',
        ),
        'hierarchical' => true,
        'rewrite'      => array( 'slug' => 'genre' ),
        'show_in_rest'           => true,
    );

    register_taxonomy( 'genre', 'book', $args );
}

你也可以将此代码添加到 bookstore_register_book_post_type 函数中,这样在注册书籍文章类型时,类型分类法也会被注册。

一旦将其添加到你的书店插件中,你会在管理菜单中看到一个新的“类型”菜单项,并且能够为你的书籍添加类型。

此外,一旦你添加了一些类型,在添加或编辑书籍时,你就可以从这些类型中进行选择。

就像常规分类法一样,你将能够浏览每个分类法的归档页面,并查看所有与该分类法关联的书籍。

进一步阅读

要了解更多关于自定义分类法及其注册方法,请访问插件开发者手册中的分类法页面。

同时,建议阅读 WordPress 开发者文档中完整的 register_taxonomy 函数参考页面,其中包含所有可以传递给该函数的参数及其作用的完整列表。

自定义文章类型

开发自定义插件的一个常见用途是利用 WordPress 文章 API 来创建自定义文章类型。

构建在线书店

假设你正在构建一个在线书店,并且想要存储待售书籍的数据。

WordPress 核心文章 API 允许你注册自定义文章类型。这些自定义文章类型扩展了核心的 post 数据类型,该类型存储在 WordPress 数据库的 posts 表中。

自定义文章类型的一个例子是 page 数据类型,它由 WordPress 核心注册。

使用 WordPress 文章 API,你可以创建一个自定义文章类型来存储书籍信息。

当你正确注册自定义文章类型时,WordPress 会自动为你的自定义文章类型创建一个新的管理菜单项,以及用于管理数据的管理页面。

自定义文章类型

要注册自定义文章类型,你需要使用 WordPress 的 register_post_type 函数。

WordPress 开发者文档中的函数参考页面可以看出,这个函数接受两个参数:自定义文章类型的名称,以及一个定义自定义文章类型的参数数组。

参数是你在函数定义中定义的变量名称。在这个例子中,参数是作为字符串变量的名称和一个参数数组。

当你使用这个函数时,你传入这些参数的值。这些值被称为参数值。

下面是一个创建参数数组并调用 register_post_type 函数,传入相关参数值来创建书籍自定义文章类型的示例。

$args = array(
    'labels' => array(
            'name'          => '书籍',
            'singular_name' => '书籍',
            'menu_name'     => '书籍',
            'add_new'       => '添加新书',
            'add_new_item'  => '添加新书',
            'new_item'      => '新书',
            'edit_item'     => '编辑书籍',
            'view_item'     => '查看书籍',
            'all_items'     => '所有书籍',
    ),
    'public' => true,
    'has_archive' => true,
    'show_in_rest' => true,
    'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt' ),
);

register_post_type( 'book', $args );

让我们看看如何在插件中实现这段代码。

实现书籍自定义文章类型

首先,按照你在“什么是插件”课程中学到的方式创建一个新插件。

wp-content/plugins 目录中添加一个名为 bookstore 的目录。

然后在该目录中创建一个名为 bookstore.php 的新 PHP 文件。

在文件中,添加 PHP 开始标签和插件头部信息到文件顶部,同时添加 ABSPATH 检查以防止直接访问文件。

<?php
/**
 * 插件名称: Bookstore
 * 插件描述: 一个用于管理书籍的插件
 * 版本: 1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // 如果直接访问则退出
}

接下来,创建一个名为 bookstore_register_book_post_type 的函数,用于注册自定义文章类型。创建参数数组,然后调用 register_post_type 函数,传入相关参数值来创建书籍自定义文章类型。

function bookstore_register_book_post_type() {
     $args = array(
        'labels' => array(
            'name'          => '书籍',
            'singular_name' => '书籍',
            'menu_name'     => '书籍',
            'add_new'       => '添加新书',
            'add_new_item'  => '添加新书',
            'new_item'      => '新书',
            'edit_item'     => '编辑书籍',
            'view_item'     => '查看书籍',
            'all_items'     => '所有书籍',
        ),
        'public' => true,
        'has_archive' => true,
        'show_in_rest' => true,
        'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt' ),
    );

    register_post_type( 'book', $args );
}

注意函数名中使用了 bookstore_ 前缀。

这是为函数名添加前缀以避免与其他插件或主题冲突的一个例子。

你可以在插件开发者手册的插件最佳实践页面中了解更多关于此方法以及其他防止函数冲突的方法。

最后一步是调用 bookstore_register_book_post_type 函数。你需要将其挂载到 init 动作上才能实现。

如果你跳过了关于 WordPress 钩子的模块,钩子是一种在 WordPress 请求生命周期中的特定点运行代码的方式。

add_action( 'init', 'bookstore_register_book_post_type' );

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

<?php
/**
 * 插件名称:书店
 * 描述:一个用于管理书籍的插件
 * 版本:1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // 防止直接访问
}

add_action( 'init', 'bookstore_register_book_post_type' );
function bookstore_register_book_post_type() {
    $args = array(
        'labels' => array(
            'name'          => '书籍',
            'singular_name' => '书籍',
            'menu_name'     => '书籍',
            'add_new'       => '添加新书',
            'add_new_item'  => '添加新书',
            'new_item'      => '新书',
            'edit_item'     => '编辑书籍',
            'view_item'     => '查看书籍',
            'all_items'     => '所有书籍',
        ),
        'public' => true,
        'has_archive' => true,
        'show_in_rest' => true,
        'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt' ),
    );

    register_post_type( 'book', $args );
}

现在,进入你的 WordPress 仪表盘并激活该插件。

你应该会在管理菜单中看到一个新的菜单项“书籍”,并且能够为你的自定义书籍文章类型添加新书。

如果你浏览 WordPress 数据库中的 wp_posts 表,会看到一个新行,其中 post_type 列设置为 book,并包含新书的数据。

自定义文章类型与性能

需要注意的是,注册过多的自定义文章类型可能会对 WordPress 网站的性能产生影响。

这是因为自定义文章类型的注册过程会在每次网站请求时执行,即使该页面并未使用该自定义文章类型。

因此,要谨慎使用自定义文章类型,并考虑何时使用它们,何时创建自定义表来存储自定义数据。

你可以在插件开发者手册的“使用插件创建表”页面中了解更多关于创建和使用自定义表的信息。

在插件开发者学习路径中,你也会学到更多相关内容。

进一步阅读

要了解更多关于自定义文章类型及其注册方法,请访问插件开发者手册中的“文章类型”页面。

同时,建议阅读 WordPress 开发者文档中完整的 register_post_type 函数参考页面,其中包含所有可传递给该函数的参数及其作用的完整列表。

插件要求

现在你已经知道什么是插件了,接下来我们来探索创建插件需要什么。

创建你的第一个插件

一个有效的 WordPress 插件最低要求是至少有一个 PHP 文件,即主插件文件,并包含一个开头的 PHP 标签。

在主插件文件内部,第一段代码应该是插件头部信息(Plugin Header),这是一个 PHP 注释块。至少需要包含一个插件名称字段。

要创建你的第一个插件,请导航到 wp-content/plugins 目录,并创建一个名为 example-plugin.php 的 PHP 文件。

cd wp-content/plugins && touch example-plugin.php

在文件内部,确保打开 PHP 标签,这样服务器才能执行 PHP 代码。

<?php

现在,在文件顶部、PHP 开始标签下方添加以下代码。

/**
 * Plugin Name: 示例插件
 */

这就是所谓的插件头部信息,它使用 PHP 注释语法的一种变体——DocBlock 来编写。

要了解更多关于 PHP 注释的内容,请查阅 PHP 手册基本语法部分中的注释页面。

创建好你的第一个插件后,现在可以浏览 WordPress 仪表盘中的“插件”页面,你会看到你的插件已经可用并准备激活。

这个插件目前还没有任何功能,但它已经准备好添加功能了。

WordPress 如何识别和存储已激活的插件

一旦插件被激活,它就会被添加到存储在选项表(options table)中序列化数组里的已激活插件列表中。你可以通过在 phpMyAdmin 中运行以下 SQL 查询来找到这个数组。

SELECT * FROM `wp_options` WHERE `option_name` LIKE 'active_plugins'

注意它如何存储 PHP 文件的文件名。这也被称为插件别名(plugin slug),WordPress 在执行过程中通过它来识别你的插件。

如果你将主插件文件移动到一个目录内,插件别名会发生变化,包含目录名称。

wp-content/plugins 中创建一个名为 example-plugin 的新目录,并将你的插件文件移动到该目录中。

如果你浏览 WordPress 仪表盘中的“插件”页面,你会看到该插件不再处于激活状态,因为别名已经改变了。

你还会注意到“插件”页面顶部有一条警告信息:

插件 example-plugin.php 因错误而被停用:插件文件不存在。

现在激活该插件。

然后返回并查看 wp_options 表中的已激活插件列表,看看新的别名(包含目录名称)是如何被添加到序列化数组中的。

插件头部信息字段

虽然插件名称字段是有效插件的基本要求,但还有额外的字段可以添加到插件头部信息中。

通常建议在插件头部信息中添加描述和版本号。这可以让用户获得更多关于你插件的信息,并且在插件列表中显示效果更好。

/**
 * Plugin Name: 示例插件
 * Description: 这是为 WordPress 开发者路径提供的示例插件。
 * Version: 1.0
 */

你可以在插件开发者手册的头部信息要求页面中查看完整的插件头部信息字段列表。

插件最佳实践

插件手册中还包含一个关于开发插件时常见最佳实践的章节。

其中一个建议是包含一个检查,确保插件代码仅在作为 WordPress 请求的一部分时执行。

if ( ! defined( 'ABSPATH' ) ) {
    exit; // 如果直接访问则退出
}

这段代码的作用是检查 ABSPATH 常量是否已定义,这是一个 WordPress 特有的常量。如果未定义,则退出插件的代码执行。

这样,如果有人试图直接在浏览器中浏览主插件文件,插件中的任何 PHP 代码都不会被执行,从而防止安全风险。

你可以在插件开发者手册的最佳实践页面中了解更多关于此建议及其他建议的信息。

什么是插件?

欢迎来到 WordPress 插件开发入门指南。

什么是插件?

WordPress 插件是一组代码包,可以安装在 WordPress 网站上,用于添加新功能或特性。

主题用于控制 WordPress 网站的外观和感觉,而插件则用于增加或扩展其功能。

为什么要使用插件?

作为 WordPress 开发者,你经常需要为 WordPress 网站创建自定义功能。

虽然可以将这些功能添加到主题或子主题的 functions.php 文件中,但通常将这些代码添加到 WordPress 插件中更合理。

这是因为插件可以独立激活或停用,而不会影响主题。

不仅如此,同一个插件还可以在多个网站上使用。

WordPress 插件目录

WordPress 插件目录包含超过五万个插件,可以安装在 WordPress 网站上。

这些插件可以将 WordPress 网站变成在线商店、社交网络、学习管理系统等等。

WordPress 插件的结构

插件目录中的大多数 WordPress 插件由多个文件组成,但要创建一个有效的插件,你实际上只需要一个主 PHP 文件,并在该文件顶部添加一个特定格式的注释块,也称为 DocBlock。

安装后,插件位于 WordPress 网站的 wp-content/plugins 目录中。

Hello Dolly 是 WordPress 最早的插件之一,它是一个单文件插件的例子。该插件的所有功能都包含在一个名为 hello.php 的 PHP 文件中。

Akismet 是 WordPress 的一个反垃圾插件,它是一个多文件插件的例子。这里的 akismet 目录包含了该插件的所有文件。插件的主文件是 akismet.php,它负责加载所有其他必需的文件。

插件开发者手册

WordPress 插件开发者手册是学习如何创建 WordPress 插件的绝佳资源。它包含如何创建插件、如何使用各种 WordPress API,以及如何将插件提交到 WordPress 插件目录的信息。

你可以通过访问 developer.wordpress.org 并点击页面顶部的“插件”链接来找到插件开发者手册。

创建区块主题插件

欢迎学习本课程,主题是 WordPress 的“创建区块主题”插件。

通过本课程,你将能够:

  • 描述“创建区块主题”插件是什么,以及为什么使用它,并且
  • 识别该插件的主要功能并描述其作用。

创建区块主题插件选项

“创建区块主题”插件由 MakeWordPress.org 社区开发。在开始使用之前,需要注意的一个重要方面是,该插件仅用于开发目的,不适用于生产环境网站。

它更像是一个用于创建新主题的工具。

安装并激活“创建区块主题”插件后,你可以导航到“外观”>“创建区块主题”。

你会看到的前四个选项都与当前激活的主题相关。

  • 将你的主题导出为压缩文件。
  • 为父主题创建一个子主题。
  • 克隆它。
  • 覆盖你当前的主题。

我将在本课程后面更详细地描述这个选项。

下一个选项是“创建空白主题”,如果你希望从一个模板或空主题开始,可以使用这个选项。

最后一个选项是“创建样式变体”。这与全局样式有关,我们将在中级主题开发者学习路径中更详细地介绍这一点。

请注意,这个插件还帮助你管理主题字体。如果你进入这个用户界面,你会看到当前主题中嵌入的所有字体。并且你会注意到有多个预览选项可用。

将更改导出到主题文件

我发现使用“创建区块主题”插件的最佳功能之一是能够直接将更改保存到主题文件中。

例如,如果我对索引模板进行更改,比如添加一个段落区块,然后点击保存,这个更改会保存在数据库中。

如果我现在对全局样式进行更改,比如在自定义调色板中添加一种新颜色,我可以搜索一种颜色或输入十六进制代码,然后命名我的颜色。我将这个命名为紫色。然后点击完成。如果我点击保存,这个更改也会保存到数据库中。

如果我们现在导航到“管理所有模板”,我们会看到在索引模板旁边有一个“已自定义”的标记。这意味着用户自定义优先。

现在,如果我回到站点编辑器,我们会看到“创建区块主题”插件的侧边栏和“保存更改”选项。这会从数据库中移除更改,并将它们推送到主题文件中。如果我们导航回“管理所有模板”,我们会注意到“已自定义”的标记已经消失了。

现在,我们快速查看一下主题文件,看看那些保存的更改。在索引模板中,我们可以看到添加的段落区块。现在让我们打开 theme.json 文件,搜索新的紫色颜色。你可以在设置中看到它,作为可供最终用户使用的新颜色。

想了解更多关于开发 WordPress 主题的内容吗?请查看中级主题开发者学习路径。

全局设置与样式

欢迎来到本课程,我们将一起探索 WordPress 的全局设置与样式。

通过本课程,您将:

  • 描述 WordPress 主题中 theme.json 文件的作用,
  • 熟悉 JSON 格式及 theme.json 的结构,以及
  • 理解用于加载网站设置和样式配置的层级结构。

为什么 WordPress 主题需要 theme.json 文件?

Theme.json 是主题的配置文件。以前,主题开发者会在经典主题中使用自定义器来为最终用户构建功能。

举个例子,如果我们查看经典主题 Twenty Twenty-One,会在自定义器中找到颜色和小工具的设置。最终用户正是通过自定义器来使用主题的。

如今,在现代化的 WordPress 中,我们有了区块主题,主题开发者现在可以使用 theme.json 来向最终用户提供这些功能。这提供了一种更一致的方式来呈现功能。

在站点编辑器中,您可以看到可以在主题中包含的设置和样式的各种可能性。

JSON 格式与 theme.json 的结构

JSON 代表 JavaScript 对象表示法,本质上是一种数据表示格式。它用于配置文件。它是通过 REST API 发送和请求数据的常见格式,轻量且易于阅读。

支持的数据类型包括字符串、数字、浮点数、布尔值、数组和对象。对于数组,我们始终使用数字索引,就像在 PHP 中理解的那样,如示例所示。

对于对象,我们使用键值对,如下例所示。这是一个来自《西部世界》的语录列表,您可以看到我刚才提到的键值格式。

另请注意,键始终是字符串。在代码编辑器中,您会在屏幕顶部找到面包屑导航,这有助于快速导航。

我的光标位于 Bernard Lowe 的第一条语录上,您可以看到它是一个数组项。另请注意,JSON 对逗号特别敏感。如果我删除一个逗号,就会收到错误消息。

查看默认主题 Twenty Twenty-Four 的 theme.json 文件。

现在我将介绍这些属性。

Schema(模式):用于定义支持的 JSON。这就是我们能获得实时提示和错误报告的原因。

Version(版本):例如版本 2。您可以在 WordPress.org 上找到这个实时参考文档,它提供了您可以设置的最新属性。

Settings(设置):用于定义区块控件、调色板、字体大小等。

Styles(样式):用于应用颜色、字体大小、应用于网站和区块的自定义 CSS 等项目。

Template parts(模板部件):在主题的 parts 文件夹中定义的模板部件的元数据。

Custom templates(自定义模板):在主题的 templates 文件夹中定义的自定义模板的元数据。

Patterns(模式):一个以逗号分隔的别名列表,用于从 WordPress.org 上的模式目录中注册。

用于加载设置和样式配置的层级结构

主题中包含的 theme.json 文件只是网站设置和样式配置层级结构中的一层。这意味着它在某些情况下可以被覆盖。

我将从低到高为您介绍这个层级的优先级。

WordPress

在安装文件中,如果您进入 WP includes 文件夹,会看到其中的 theme.json 文件,该文件定义了默认设置和样式。

主题的 theme.json 文件

您在该文件中定义的任何内容都会覆盖 WordPress 的默认设置。如果您有一个处于激活状态的子主题,并且子主题中包含 theme.json 文件,那么您在此处所做的任何设置都将优先于父主题中的 theme.json 文件。例如,您可以将“外观工具”设置为 false。

用户配置

在站点编辑器中,任何通过全局样式甚至模板更改并保存到数据库的更改,都将覆盖并优先于层级结构中的所有其他级别。

总结

在《中级主题开发者学习路径》中,可以找到更详细的信息。

别忘了,你还可以访问 theme.json 参考指南,进一步熟悉 JSON 模式。

模板

欢迎来到关于 WordPress 主题模板的课程。

通过本课程,你将能够:

  • 描述什么是主题模板以及 WordPress 如何为你处理最终的标记,
  • 理解模板系统的工作原理,
  • 列出并描述主题中常见的典型模板,以及
  • 区分模板和模板部分。

主题模板以及 WordPress 如何处理最终标记

模板是表示前端整体文档结构的文件。对于现代区块主题,它们由区块标记组成,并渲染静态和动态数据。

让我们来看一个页面的模板。我们将在站点编辑器中打开页面模板,并打开代码编辑器来查看区块标记代码。

区块标记通过特定的 HTML 注释符号来标识。它告诉正在渲染的页面输出该区块的结果。关于区块的额外信息,如属性或内联样式,会以 JSON 格式传递给区块标记。WordPress 解析这些区块标记,并将其转换为在网页浏览器中显示的最终 HTML 标记。

模板系统的工作原理

当有人访问 WordPress 网站的单篇文章时,所使用的模板遵循模板层级结构规定的一组规则。这是一张图表,可在 WordPress.org 上找到,请注意,决策过程在此图表中从左到右进行。

例如,以我们的例子来说,当网站访问者导航到一篇单篇文章,而当前激活的 WordPress 主题既不包含 single.html 也不包含 singular.html 模板时,它将默认使用 index.html 模板。现在让我们看看主题中常见的典型模板。

这些是 Twenty Twenty-Four 主题中包含的模板。

主题中常见的模板

Index:这是备用模板文件,是所有主题中必需的文件。

Single:当访问者请求单篇文章时使用,正如我们在例子中看到的。

Page:当访问者请求单个页面时使用。

Archive:当访问者按归档类型(例如分类或作者)请求文章时使用。

Search:当访问者在网站上执行搜索时,用于显示搜索结果。

404:当 WordPress 找不到与访问者请求匹配的文章、页面或其他内容时使用。

模板和模板部分的区别

在我们的主题文件夹中有一个 parts 文件夹,其中包含模板部分文件。模板部分旨在提供网页中重复出现的区域,并从根本上消除了多次创建它们的需要。

一个很好的例子是页眉或页脚,此外,它们还能在整个网站中提供一致的外观和感觉。模板可以包含一个或多个模板部分,但也可以选择不包含任何模板部分。

至此,我们对 WordPress 模板的简要概述就结束了。请注意,你将在中级主题开发者学习路径中学习更多关于创建模板和模板部分的知识。

主样式表

欢迎来到本课程,我们将一起探索 WordPress 主题的主样式表文件。

通过本课程,你将能够:

  • 创建 style.css 文件头部,配置主题的相关数据,
  • 描述主题 style.css 文件中可用的头部字段列表,以及
  • 添加必要的头部字段,在子主题中指定父主题的文件夹。

创建 style.css 文件头部,配置主题的相关数据

style.css 文件是每个 WordPress 主题必需的样式表。该文件的头部注释部分用于让 WordPress 和用户了解主题信息。

在代码编辑器中,我们可以查看默认 WordPress Twenty Twenty-Four 主题的 style.css 文件头部。当你还在代码编辑器中时,快速看一下 screenshot.png 图片文件。现在,我们切换到 WordPress 仪表盘。

进入 WordPress 仪表盘后,转到“外观”>“主题”,然后进入“主题详情”。在主题详情中,我们可以在左侧看到截图,右侧看到来自 style.css 文件头部的信息。我们还能看到主题名称、版本、作者、作者网址、描述,最后还有一个标签列表。

主题 style.css 文件中可用的头部字段

现在,让我们更仔细地看看主题 style.css 文件中可用的不同字段。为了演示,我们将使用默认 WordPress 2024 主题的主样式表文件。我们会逐一查看样式表中包含的字段。

从主题名称开始,请注意这必须是唯一的,特别是如果你计划将主题提交到官方 WordPress 目录。正如我们在 WordPress 中看到的,主题名称会被用户看到,所以在选择名称时要考虑这一点。

请注意,如果你刚开始学习主题开发,添加主题名称后就可以停止了。这实际上就是你所需的一切。

其余可选字段:

主题 URI,这是一个公共网页的 URL。人们会通过这个链接获取关于你主题的更多信息。

作者姓名,后面跟着一个 URL,提供关于作者的更多信息。

描述,同样,如果你希望用户看到并了解这个主题是否适合他们,这一点尤其重要。

你的主题能够兼容的最旧 WordPress 版本。

主题经过测试的最新 WordPress 版本。

主题能够兼容的最旧 PHP 版本。

版本号,后面跟着许可证和许可证 URL。

文本域,这是一个用于翻译的字符串,所以如果你计划翻译主题,请确保包含它,并且要全部使用小写字母。

最后是标签,这是一个以逗号分隔的列表,列出了你的主题支持的功能。

在子主题中指定父主题文件夹所需的头部字段

创建子主题实际上是主题开发者更高级的话题,但这里值得简要提一下。重要的是要理解,你的子主题不仅继承父主题的函数、过滤器、模板等,还会扩展和覆盖父主题。

子主题和父主题之间的这种连接是通过在子主题的 style.css 文件中添加头部字段“Template”来建立的。以下是一个为 Twenty Twenty-Four 主题创建的子主题示例。