本文档将向您介绍 functions.php 文件。它是您在 主题结构 中首先了解的可选标准文件之一。块主题和经典主题都可以使用它。

以下内容将向您介绍在 functions.php 中使用 PHP 的核心概念,但它不会教您 PHP 编程语言本身。您可以访问官方 PHP 文档 以获取有关如何编写自己的 PHP 代码的更多信息。

在整个手册中,您将遇到更多添加自定义功能的示例,因此掌握基础知识非常重要。您可以在 功能、高级主题 和 经典主题 章节中进入更高级的 PHP 示例。

functions.php 是什么?

functions.php 本质上就像一个 WordPress 插件,允许您添加自定义 PHP 函数、类、接口等。它为您的主题打开了整个 PHP 编程语言。

WordPress 会在加载网站的管理端和前端的所有页面视图时自动加载 functions.php 文件(如果存在)。因此,它为您提供了很多构建围绕 WordPress 的独特功能的能力。

仅仅因为您可以在主题中构建类似插件的功能并不意味着您总是应该这样做,特别是如果您将主题分发给他人使用。如果您创建的功能应无论网站的设计如何都可用,最佳做法是将代码放在插件中。一般规则是主题应只处理网站的设计。

虽然所有主题都可以有自定义 functions.php 文件,但 WordPress 只会加载当前激活主题的该文件。

这条规则的例外情况是当子主题处于活动状态时。在这种情况下,WordPress 会在加载父主题的 functions.php 之前先加载子主题的 functions.php。您可以在高级主题章节中了解有关 子主题 的更多信息。

functions.php 的常见用途

由于 functions.php 文件允许您编写任何 PHP,因此您经常会看到具有截然不同的代码、组织系统、命名约定等的主题。您对 PHP 的理解越深,就越容易遵循来自其他主题的代码。

以下是一些您经常会在主题中的 functions.php 文件中找到的用途。

向钩子添加操作或过滤器

钩子是扩展 WordPress 功能的入口点,为您提供了一种注入自定义代码或过滤数据的方法。将其视为主题(和插件)直接与 WordPress 通信的一种方式。

WordPress 的钩子系统提供了两种不同的方法,用于在页面加载过程中执行您的代码:

  • 操作钩子允许您运行自定义操作回调并“对”其接收的信息采取行动。
  • 过滤器钩子让您通过自定义过滤器回调过滤数据并对其进行操作。

从技术上讲,钩子是插件 API 的一部分,您可以在插件手册中 阅读有关它们的文档。

尽管在插件 API 中,但在主题的上下文中,钩子也非常有用。与插件一样,您应该始终在钩子上运行代码,以便它在加载过程的适当点执行其功能。

在整个手册中,您将看到来自 functions.php 添加功能或功能的示例,这些示例将始终使用钩子。熟悉它们的文档将使您更容易理解手册中的 PHP 代码。

主题设置函数

许多主题的常见用例是添加一个设置函数,该函数通常用于向 WordPress 注册主题支持的功能。这几乎总是在 after_setup_theme 操作钩子上执行,这是主题 functions.php 文件加载后可用的第一个钩子。

要测试此功能,请打开您的主题的 functions.php 文件(如果不存在则创建一个),并添加以下 PHP 代码:

<?php
add_action( 'after_setup_theme', 'theme_slug_setup' );

function theme_slug_setup() {
	add_theme_support( 'wp-block-styles' );
}

此代码为您的主题添加了 WordPress 更主观的块样式的支持。您不必使用它;它仅作为设置函数可能看起来如何的示例。

设置函数在经典主题中更为常见。在使用块主题时,主题通常会自动选择所需的功能。您可以在这里找到主题支持功能的列表:

加载脚本和样式

如果您熟悉 HTML,您可能会通过 <script> 标签添加 JavaScript 或通过 <link rel="stylesheet" /> 或 <style> 标签添加样式表。

WordPress 提供了用于加载脚本和样式的辅助函数和特定操作钩子。这确保了它们在文档输出的适当位置注入。WordPress 为您创建适当的 HTML 标记。

您可以在 包含资源 文档中了解有关加载脚本和样式的更多信息。

在构建块主题时,通常不需要包含额外的脚本/样式。一些主题完全依赖 全局设置和样式 进行前端设计。

包含其他 PHP 文件

WordPress 会自动为您加载主题的 functions.php,但您不限于仅在该文件中添加自定义 PHP 代码。您可以从主题的其他位置加载具有 PHP 接口、类、特性(traits)和函数的其他文件。

正如您在 主题结构 中所学,一些主题包含一个名为 /inc(或任何自定义文件夹)的自定义文件夹来存储自定义 PHP 文件。假设您有一个 /inc/helpers.php 文件用于自定义辅助函数,您可以通过 functions.php 使用 get_parent_theme_file_path() 函数加载它:

include get_parent_theme_file_path( 'inc/helpers.php' );

一般来说,您应该使用此函数获取需要加载的任何 PHP 文件的正确目录路径。

或者,如果您想允许子主题通过回退到父主题来覆盖文件,您可以使用 get_theme_file_path():

include get_theme_file_path( 'inc/helpers.php' );

让子主题用 PHP 函数或类覆盖文件不是标准做法,但确实存在需要它的用例。

避免在文件末尾关闭 ?> 标签

本节可以题为“如何避免可怕的 WordPress 白屏死亡。”

您可能会看到各种原因导致网站损坏,除了白屏之外。其中一个原因是当 functions.php 文件(或任何 PHP 文件)在其关闭的 ?> 标签之后有空格时:

<?php
// some code...
?>
 

许多编辑器配置会自动在文件末尾添加额外的一行(一种常见的开发实践)。当您在文件末尾添加关闭的 ?> 标签时,很容易错过这个额外的空格,这可能会在某些环境中导致“白屏死亡”。

避免此问题最简单的方法是根本不留下关闭的 ?> 标签,这是完全有效的 PHP 和标准做法。上面的代码应写为:

<?php
// some code...