WordPress 功能插件

Avatar of Jason Witt
Jason Witt

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费积分!

以下是 Jason Witt 的客座文章。我一直都知道我应该将 WordPress 主题中的 `functions.php` 文件中的许多内容移植到一个功能插件中。但是你知道的,一天中的时间就是这样。我最近让 Jason 为我处理了这个项目,他做了一份很棒的工作。如果你不知道我在说什么,请继续阅读。

向 WordPress 网站添加新功能就像在 WordPress 插件库中搜索插件并安装它一样简单。但是,您可能需要一些自定义功能,这些功能要么过于基本,要么过于定制,以至于没有相应的插件。这时 `functions.php` 文件就派上用场了。它本质上是主题的功能转储地。

但我们倾向于放在那里的某些代码最好放在别处。

`functions.php` 文件是一个在其中添加主题支持选项、自定义帖子类型、排队 JavaScript 以及(实际上)您可以想到的任何其他内容的简单位置。多年来,这已成为向 WordPress 主题添加自定义功能的实际方法。在过去几年里,出现了一种趋势,即将通常放在 `functions.php` 文件中的功能 **迁移到“功能插件”中。**

什么是功能插件?

功能插件与您在 WordPress 插件库中找到的任何其他插件一样。主要区别在于它不会公开发布,因为它特定于您的网站。它是一个自定义插件,涵盖了您所有网站的自定义功能。

功能插件有什么优点?

为什么您要花时间构建一个插件,而将您的功能放在 `functions.php` 文件中如此简单?最大的优势是 **您可以跨主题重复使用您的功能。** 当您更新/更改主题时,`functions.php` 中的一些代码将保持不变,而另一些代码将更改。功能插件的理念是将不会随主题而改变的功能放到插件中。这样,您就不必在 `functions.php` 文件中查找要保留的内容,而是可以直接深入到新主题的设计中。

插件中包含什么内容?

这是个百万美元的问题。功能插件中到底包含什么内容?解决这个问题的最佳方法是确定哪些内容是特定于 *主题* 的,哪些内容是特定于 *网站* 的。例如,自定义帖子类型是 **特定于网站的**,而添加缩略图支持是 **特定于主题的**。

让我们暂停一下,以便能够非常清楚地理解这一点。

假设您的网站有一个关于聚会的版块。您为它们构建了一个自定义帖子类型,以便它们可以成为一种特殊类型的內容。在网站前端,您以特殊方式显示它们。在网站后端,您收集特定于聚会的特殊信息。就像在 这个 CSS-Tricks 视频 中一样。我们将其称为 **主题 A**。

如果您更改了网站主题(**主题 B**),您是否可能希望您的聚会信息消失?可能不会。那是您可能希望跨越任何特定主题的网站内容。

如果您在 **主题 A** 的 `functions.php` 文件中声明了所有自定义帖子类型内容(例如 register_post_type()),然后切换到 **主题 B** - *您可能会感到轻微的心脏病发作*,当您注意到所有聚会信息都消失了。主题 A 的 `functions.php` 文件不再处于活动状态,因此所有声明自定义帖子类型的代码不再运行。菜单不会添加到管理面板中,内容将看起来消失了。

请放心,数据仍然存在,您只需要确保自定义帖子类型代码再次运行。

为什么还要经历这一切?只需将该代码移动到功能插件中,即使切换主题,它也会保持活动状态。

现在想象一下完全不同的事情:`functions.php` 文件中的代码排队了一个 JavaScript 库。您可能正在使用该库在网站前端执行某些操作。这对于主题来说是相当具体的。另一个主题可能完全使用不同的库,或者根本不使用。这种事情放在 `functions.php` 文件中是有意义的,因为它 *特定于主题*,而不是内容。

`functions.php` 中有意义的内容示例

  • 主题支持函数,例如 add_theme_support('post-thumbnails');
  • 与前端相关的 JavaScript
  • 向主页帖子列表添加自定义帖子类型
  • 注册侧边栏和导航菜单
  • 添加一个外部 CSS 文件,例如 自定义字体

功能插件中有意义的内容示例

  • 自定义帖子类型
  • 自定义分类法
  • 其他插件的自定义功能
  • 自定义元字段
  • 主要是自定义内容

入门

如果您以前从未创建过 WordPress 插件,那么这是一个获得一些经验的好方法。

首先,您将在插件目录中创建一个目录。将其命名为您想要的任何名称。避免使用数字和特殊字符;连字符和下划线是可以的。我通常使用类似 mysitename-functionality 的名称。

在您的新插件文件夹中,创建一个与文件夹名称相似的文件,例如 mysitename-functionality.php

在该文件顶部,您需要添加插件文件头信息。以下是一个示例,可以帮助您入门。

/**
 * Plugin Name:       Your Functionality Plugin Name
 * Plugin URI:        http://example.com/plugin-name-uri/
 * Description:       This is a short description of what the plugin does. It's displayed in the WordPress admin area.
 * Version:           1.0.0
 * Author:            Your Name or Your Company
 * Author URI:        http://example.com/
 * License:           GPL-2.0+
 * License URI:       https://gnu.ac.cn/licenses/gpl-2.0.txt
 * Text Domain:       plugin-name
 * Domain Path:       /languages
 */

之后,尽情发挥并开始在下方添加您的功能。

您可以从 `functions.php` 文件中直接剪切和粘贴代码到此文件中,只要此插件处于活动状态,它就应该可以正常工作。

模块化设计

如果您像我一样喜欢井井有条,那么现在是时候对您放在插件中的代码使用模块化方法了。

一种简单的方法是将您的功能整理成类似的组,并为每个组提供自己的文件。然后,使用 PHP 包含将这些文件包含到插件的主文件中。确保您对函数进行注释,这样当您在以后的日期返回它们时,您就会知道发生了什么。

include 'mysitename-functionality-post-types.php';
include 'mysitename-functionality-extra-rss-feeds.php';
include 'mysitename-functionality-remove-unwanted-assets.php';

另一种方法是使用面向对象编程 (OOP)。这涉及创建 PHP 类和方法。如果您不熟悉面向对象编程,那么 Tom McFarlin 的一个很棒的教程名为 WordPress 中的面向对象编程。如果您有兴趣发展您的 WordPress 编码技能,您应该看看它。OOP 是组织代码的好方法,它可以让您的代码随着功能需求的变化而增长。

实际示例

如果您想浏览 CSS-Tricks 功能插件,这里有一个 GitHub 上的仓库,您可以查看。

经过这次转换,`functions.php` 文件中只剩下排队加载 jQuery 和一个覆盖默认 HTML 注释输出的钩子——这两项都非常特定于当前主题。