dd

WordPress 插件开发教程 – Part-1 – WordPress 插件简介

十度 wordpress 2015年12月02日 收藏

本部分教程包括以下内容:

  • 了解什么是插件
  • 使用可用的 WordPress APIs
  • 插件的加载顺序
  • 热门插件示例
  • 分别插件和模板功能上的不同
  • 安装和管理插件
  • 了解插件的类型

WordPress 是现在很火的开源免费的内容管理系统。它火的一个重要原因就是你可以方便的通过插件来自己定制它。WordPress 为开发者提供了一个十分方便且强大的平台。

首先明白插件如何工作的,以及 WordPress 中所包含的工具,是开发专业的 WordPress 插件的关键。

什么是插件?

插件( Plugins )是如何与 WordPress 交互的:

WordPress 为插件提供了多种丰富的 APIs。每一种 API( 应用程序接口 )使插件和 WordPress 以不同的方式交互。下面是 WordPress 提供的主要 APIs 以及他们的功能列表:

  • 插件: 给插件提供一系列的钩子( hooks )来使用 WordPress 的相关部分。WordPress 包含两种不同类型的钩子: 动作( Actions )和过滤器( Filters )。动作让你可以在运行时的特定时刻触发自定义的插件代码。例如,可以在用户在 WordPress 中注册了一个账户后触发一个自定义函数。 过滤器用来修改在数据库中添加或获取的数据。
  • 小工具( Widgets ): 在你的插件中创建和管理小工具。Widgets 在 Appearance -> Widgets 下面,并可以在你的模板中任何注册过的 sidebar 中添加。这个 API 允许在 sidebar 里面添加一个 widget 的多个实例。
  • 短代码( Shortcode ):为你的插件提供短代码支持。短代码是一个可以让你通过类似这样[shortcode]的方法调用一个 PHP 函数的钩子。
  • HTTP: 从你的插件发送 HTTP 请求。这个 API 可以从一个外部的 URL 获取或者提交内容。目前你有5种发送 HTTP 请求的不同方法。这个 API 在每个方法执行前使过程标准化。这个 API 会基于你的服务器的设置使用合适的方法来发送请求。
  • 设置( Settings ): 在你的插件中插入设置部分。使用设置 API 的主要好处就是安全。所有的设置数据都是检查过的,所以当你保存插件设置时不用担心跨站虚假请求攻击( cross site request forgery, CSRF) 和跨站脚本( cross site scripting XSS )攻击。
  • 选项( Options ): 在你的插件中保存和获取选项。这个 API 允许创建新选项,更新现有选项,删除选项以及可选的控制板( Dashboard )定义。
  • 小工具( Widgets ): 创建控制板小工具。小工具自动出现在 WordPress 的后台控制板中,并且包含标准的自定义操作,包括最小化、拖拽和隐藏。
  • 重写( Rewrite ): 在插件中创建自定义的重写规则。这个 API 让你添加静态链接-点( /custom-page/),结构标签( %postname% ),和附加的 feed 链接( /feed/json/ )。
  • 临时选项( Transients ): 在你的插件中创建临时选项( 缓存数据 )。这个 API 类似于 选项( Options ) API,只不过所有的选项都有过期时间。
  • 数据库( database ): 可以访问 WordPress 数据库。可以再你的插件中增删改查数据库记录。

WordPress 中的函数也可以是”插件”(插件函数)。这些函数让你可以继承一个插件里面的核心函数。例如,wp_main() 函数就是一个”插件函数”。你可以在你的插件中定义这个函数,然后使用 SMTP 而不是默认的方法来发送邮件。所有的”插件函数”都定义在 /wp-includes/pluggable.phpCore 文件中。在特定的插件任务过程中,你可以使用一些预定义的函数,例如当一个插件启用或者停用或者删除插件的时候。在第二章: 插件基础, 中将详细介绍

插件什么时候加载?

插件在 WordPress 页面调用之前加载。图 1-1 显示了 WordPress 页面加载的标准过程。在加载 admin 页面的时候流程有少许变化。不过差异很小,主要是关于加载什么模板的:管理页面模板或者网站模板。

可用的插件

你要知道在哪里找 WordPress 插件。网上到处都能下载到插件,但是这并不总是个好主意。从不可靠的地方下载插件可能导致恶意软件注入,以及危害其他插件。最好从官方网站以及可靠的网站下载插件。

官方插件下载地址

找插件第一个考虑的地方就是 wordpress.org 官方插件地址

超过10,000种插件供选择,上亿次的下载量。这里的插件是 100% 遵循 GPL 的免费的供个人或者商业使用的。

热门插件:

下面是5个下载次数最多的插件:

如你所见,上面的插件可以解决很多问题。这些插件提供的功能是非常常用的,也是许多网站需要具备的功能。

使用插件的优势:

在 WordPress 中使用插件有许多优势。你需要理解编写插件的优势,从而真正的明白为什么要编写插件。这也能在编写一个特殊的插件时帮助理解需求。

不修改核心:

使用插件的一个主要优势在于,控制 WordPress 的功能,而不需要修改任何核心文件。核心文件是指所有WordPress 默认安装的文件。

修改核心文件会为升级 WordPress 新版本的时候带来麻烦。如果你修改了 WordPress 的任何核心文件,在升级的时候这些修改就会被覆盖重写。而更新 WordPress 最重要的是为了保证你的网站的安全。

修改核心文件同样可能引起网站的不稳定。WordPress 中不同的部分的功能的实现要依赖于其他部分。如果你修改了核心文件是它不能按期望的工作,则可能会一起不稳定,甚至很可能破坏整个不相关的功能。

为什么还要重新造轮子呢?

编写插件的另一个优势在于,整个架构已经是现成的了。许多通用的功能已经开发好了并可以直接在你的插件中直接使用了。例如:使用 WordPress 中内建的用户角色,你可以很容易的限制你的代码只有用户为管理员时才执行。看下面的例子:

<?php
    if( current_user_can('manage_options' )) {
        // 这里面的代码只有用户是 管理员的时候才执行。
    }
?>

如你所见,很容易验证一个用户有特定的权限来执行你插件中的代码。在第八章,“用户”中你可以看到账户和角色的内容。

另外一个例子,看看在 WordPress 中发送邮件。当然你可以创建自己的发送邮件的插件,可以有什么必要呢?WordPress 有叫做 wp_main() 用来发送邮件的辅助函数。看下面的例子:

<?php
    $email_to= 'you@example.com';
    $email_subject= '邮件例子';
    $email_message= '我的新插件怎么样?';
    $wp_mail($email_to, $email_subject, $email_message );
?>

正如你所见,在 WordPress 中发送邮件是多么的容易。除非你的插件需要一些自定义的邮件功能,否则你么必要从头来写这些功能。使用这个函数同样可以确保从 WordPress 中发邮件时最广泛的适用因为你使用的是内建的函数。

使用 WordPress 内建的功能可以节省你开发插件的时间。使用这些内建的函数而不是重造车轮的另一个好处是可以使你的插件在各种不同的服务器环境和设置下正常工作,因此最大化了兼容性。不要重建 WordPress 中已经有的车轮!

区分插件和模板

一个插件可以控制表现的过程;因此一个插件可以变成一个“模板”。类似的模板可以包含插件的功能。因为有时候两个之间的区别会变得模糊,那为什么不直接在你的模板目录中直接包含插件呢?这是一个普遍的问题,也有几个不同的回答。

模板应该包含插件的功能吗?答案是:不应该。主要的原因是因为插件是用来为 WordPress 来添加功能的,而不管用的是哪个模板。这就将你网站的设计和网站的功能很好的区分开来。这个区分是为了你的模板不用捆绑所需要的功能。WordPress 使得你非常容易的改变你的设计,或者说模板,任何时候至于要点几下。如果所有的模板功能都包含在你的模板中,当你换模板的时候,你就会失去那些功能。

还有另一个激烈的争论是:核心功能应该包含在模板中。大多数模板具有的一个普遍功能是 “我在这里” ( breadcrumb ) 导航。这个功能当然可以存在在一个插件中,但是导航栏作为一个核心功能 – 应当包含在模板当中。而且搜素引擎优化功能作为一个常用功能也应该包含在模板中。

方便更新

WordPress 使得更新插件很容易。所有从wordpress.org 官方插件地址 下载安装的插件在有新版本的时候都会提醒你更新。更新插件只需要在后台插件页面中间的的操作就可以搞定。

而不是从官方插件目录安装的插件也可以使用 WordPress 的自动更新功能来更新。插件作者必须设定在哪里可以得到插件的新版本,这样就可以自动更新了。而如果插件的作者没有定义更新的地址,你就必须手动更新插件了。

保持插件更新是使你的网站免受攻击以及消除bug的重要步骤。

方便共享和重用

插件可以很方便的与他人共享。共享一个插件比告诉别人如何修改你的模板的代码容易多了。使用插件同样可以使多个网站具有同样的功能。如果你发现了你喜欢的一些插件,你可以方便的在你的每一个 WordPress 网站上面安装和使用。

插件沙盒

当你在 WordPress 中启用了一个损坏的插件,它不会毁掉你整个网站。如果插件触发了一个致命错误,WordPress 会在它造成破坏之前自动停用它。这种安全的特性使启用和测试新插件的时候的风险大大降低。虽然插件确实会引起错误的白屏或者错误信息,你可以简单的把插件的目录重命名,这样 WordPress 就会自动的停用它了。这样就避免了流氓插件把你自己锁在自己的网站外面。

换句话说,如果你直接修改了 WordPress 的核心文件,你很可能引起一些导致整个网站崩溃的致命错误。这包括造成使得 WordPress 无法修复的损害。

插件开发社区

插件开发有很强大的社区支持,分享知识和代码,并且开发有用的插件。加入这些社区是提高你的插件开发能力的一个非常好的方法。第十八章,”开发人员工具箱” 中将包含许多相关信息。

插件的安装和管理

WordPress 所有插件的管理都在 WordPress 控制板的”插件“页面下,如图 1-2 所示。

图 1-2 中的菜单只对”管理员“可见,非管理员用户是看不到的。如果你使用 WordPress 的多站点功能,插件的菜单默认是隐藏的。你需要在 Admin -> Settings 中启用这个菜单。

安装插件

WordPress 中有三种安装插件的方法。你可以选择其中方便快捷适合你的。

第一种方法:使用内建的安装程序。这种方法允许你在“控制板”中搜索wordpress.org 官方的插件。找到后点击安装,这个插件就会自动下载安装了。

第二种方法:使用 zip 上传程序。你可以上传插件的 zip 压缩文件,WordPress 可以解压并且安装它。使用这种方法只需要在插件安装页面点击“浏览”( Browser )按钮,然后选择插件的 zip 压缩文件上传,点击 现在安装( Install Now )按钮来安装。如图 1-3 所示。

第三种方法:使用 FTP 协议来安装插件。这种方法就是使用FTP客户端程序连接你的网站服务器,手动上传插件的整个目录或者文件到 WordPress 的 wp-content/plugin/ 目录下。

管理插件

编辑插件

插件目录

很少人知道,实际上 WordPress 有两个插件的目录。主插件目录在 wp-content/plugins/ 下面,在安装 WordPress 时自动创建。第二个插件目录位于 wp-content/mu-plugins 下面,表示“必须使用” ( Must-Use ),它不是由 WordPress 自动创建的。你必须亲自创建来用。

两者之间主要的不同在于,mu-plugins 目录是用来放永远执行的插件的。这意味着,在这个目录下的插件会自动的在 WordPress 以及多站点中加载

mu-plugins 目录不会识别子目录,所以所有的插件必须是独立的文件,或者是包含一个子目录中的附件文件。除了在主插件文件中被包含的子目录中的内容,子目录中其他内容都会被忽略。

插件的类型

WordPress 的插件有几种不同的状态。如图 1-4 所示。你在开发和管理插件的时候需要了解这些不同。

  • 启用( Active ) — 在 WordPress 正在使用的插件。
  • 停用( Inactive ) — 安装了但是没有启用。插件中的代码不会被执行
  • 必须使用( Must-Use ) — 所有安装在 wp-content/mu-plugins 目录下的插件。这些插件会自动加载。唯一停用 MU 插件的方法是从 mu-plugins 目录中将其删除。
  • Drop-ins — WordPress 中的核心功能可以被 Drop-in 插件代替。这些插件是位于 wp-content 目录下的一些有特殊文件名的 PHP 文件,它们会被自动加载,并列在插件管理页面的 Drop-in 过滤器下。一下十种 Drop-in 插件可用:
    • advanced-cache.php — 高级缓存插件
    • db.php — 自定义数据库类
    • db-error.php — 自定义数据库错误信息
    • install.php — 自定义安装脚本
    • maintenance.php — 自定义维护信息
    • object-cache.php — 扩展的对象缓存
    • sunrise.php — 自定义域名映射
    • blog-deleted.php — 自定义 blog 删除信息
    • blog-inactive.php — 自定义 blog 停用信息
    • blog-suspended.php — 自定义 blog 挂起信息

最后四个 Drop-in 插件,是 WordPress 多站点功能所特有的。标准安装的 WordPress 是没有这些插件的用法的。

当开发一个新插件的之前,先确定你想创建哪一种类型的插件。大部分插件都是 WordPress 标准的插件,但是偶尔你可能需要创建 Must-Use 插件或者 Drop-in 插件。

测试插件的功能

有时候你能你只是想测试一个插件功能,而不是真的创建一个插件。许多开发者会直接将代码放进 wp-config.php 文件当中来进行功能测试。这是一种不好的方法,不应该用它,因为当 config.php 文件解析和加载后,WordPress 还没有完全的启动。

不要用修改 wp-config.php 的方法,而是用下面的代码段建立一个 test.php 文件并放在你的 WordPress 根目录下:

<?php
    // 加载 WordPress 环境
    // define( 'WP_DEBUG', true ); / * 要 debug 模式 取消注释。*/
    require('./wp-load.php' );
    // require_once( './wp-admin/admin.php' ); /* 要 is_admin() 取消注释 */
?>
<pre>
<?php
    /* 下面是测试的代码 */
    var_dump( is_admin() );
?>
</pre>

这一一种加载所有 WordPress 功能来测试插件功能而不用创建一个插件的快速方法。正如你所见,在文件开头包含wp-load.php 文件。你也可以包含 wp-admin/admin.php 文件如果你想测试管理员的功能。一旦你包含了 WordPress 所需要的核心文件,你就可以测试任何代码了。在测试完成后,别玩了删除 text.php 文件。

总结

这一章,我们学到了什么是插件,以及它们如何同 WordPress 的 APIs 进行交互。我们讨论了使用插件的主要优势以及为什么插件的功能不应该全部直接放在模板里面。我们还讨论了在后台控制板中安装和管理插件。

现在你已经明白了插件在 WordPress 中如何工作,我们是时候开始编写插件了!


dd