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 注释输出的钩子——这两者都非常特定于当前主题。