插件开发
简介
在WordPress博客上,用户可以轻松实现对插件的更改、定制以及功能强化。用户不必更改WordPress的核心程序就可以为WordPress插件添加各种功能。下面是对WordPress插件的简单定义:
WordPress插件:WordPress插件是一个能够扩展WordPress博客功能的PHP脚本程序或函数集。通过线路入口和WordPress插件API(应用程序接口),WordPress插件能够实现与WordPress博客的无缝结合。
有时你是否希望WordPress能够增加一些新功能,或者能够修改其中某个功能?这时可以先查找不同WordPress插件库以及各种插件资源,看是否已经有人开发了符合你需要的插件。如果没有,那么请根据这篇文章的指导,开发一个属于自己的WordPress插件吧。
有关资料
- WordPress插件的工作方式和安装方法可参见插件。
- Plugin Resources为插件开发人员列出一份详细的文章列表,包括一些介绍如何编写WordPress插件以及特殊插件问题的外部文章。
- 要了解编写WordPress插件的基本原理,可以参考优质插件的源代码,例如WordPress发布的Hello Dolly。
- 插件开发完成后,根据插件提交和推广中的操作说明发布自己开发的插件
新建插件
本部分内容向大家介绍了插件的各个开发步骤,以及要建立一个优质插件必须要考虑的一些问题。
插件名称、文件、位置
插件名称
开发插件时,首先要考虑到的就是插件的功能,以及为插件起一个好名字(插件名称最好是独一无二的)。事先检查插件和其中提到的插件库,确定自己的插件名称的确是唯一的;当然也可以到Google上确认一下。大多数插件开发人员选择插件名称时都希望它能在一定程度上反映插件的功能;例如与天气相关的插件,名字中可能就有“weather(天气)”这个词。一个插件名称中可以包含很多个单词。
插件文件
接下来我们需要创建一个PHP文件,根据插件名称为该PHP文件命名。例如,如果插件名为“Fabulous Functionality”,PHP文件名可以是fabfunc.php。这里的文件名最好也是唯一的。用户安装了我们开发的插件后,这个PHP文件会被存储在用户安装文件的WordPress插件文件夹wp-content/plugins/中,这样一来各个插件的PHP文件名就不会有重复,用户也无需费时寻找自己所要的PHP文件了。
另一种方法是将插件拆分为多个文件。我们开发的WordPress插件至少有一个PHP文件;插件中可能还包括JavaScript文件、CSS文件、图片文件、语言文件等。如果插件由多个文件组成,文件夹和主PHP文件的名字应该是唯一的,例如在Fabulous Functionality插件中,文件夹名称和主PHP文件名称分别可以是fabfunc和fabfunc.php。将所有插件文件都放入文件夹中,通知用户将整个文件夹存放在 wp-content/plugins/下。
在文章接下来的部分中,“插件PHP文件”即主插件PHP文件,无论该文件出现在 wp-content/plugins/或是子文件夹中。
Readme文件
如果希望将自己开发的插件放在http://wordpress.org/extend/plugins/下,我们还要按照标准格式为插件新建一个readme.txt文件,将文件包含在插件文件中。 http://wordpress.org/extend/plugins/about/readme.txt中详细介绍了readme文件的格式。
主页
创建一个网页来作为插件的主页也是个不错的选择。网页中的内容应该包括插件的安装方法、插件的功能、插件可兼容的WordPress版本、插件各个版本的修改记录以及插件的具体用法等。
文件头
现在我们要在主插件PHP文件中添加一些内容。
标准插件信息
插件的主PHP文件顶端中必须包括一个标准的插件信息头。WordPress通过信息头判断该插件的存在。我们可以将信息头放在插件管理界面中以激活信息头,之后加载信息头并运行信息头中的函数;如果没有信息头,插件永远不会被激活,WordPress也不可能运行插件。下面是信息头的格式:
?php /* Plugin Name: Name Of The Plugin Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates Description: A brief description of the Plugin. Version: The Plugin's Version Number, e.g.: 1.0 Author: Name Of The Plugin Author Author URI: http://URI_Of_The_Plugin_Author */ ?>
对WordPress来说,Plugin Name这一代码行是绝对必要的,WordPress需要通过它来识别插件。其它行信息(如果插件提供了其它信息)则用于生成插件管理界面上的插件表单。代码行顺序不分先后,用户可以自行排列。
许可证
用户习惯于在标准信息头中查找插件的许可证信息。大多数插件都使用WordPress所用的 GPL 许可证或一种能与GPL兼容的许可证。我们可以在插件中加入下列代码以表明插件的GPL许可证信息:
<?php /* Copyright YEAR PLUGIN_AUTHOR_NAME (email : PLUGIN AUTHOR EMAIL) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ ?>
编写插件
接下来应该考虑插件的具体功用了。本部分内容包括插件开发的一些基本理论,同时也描述了怎样完成插件需要进行的几项任务。
WordPress插件钩子
WordPress中很多插件会通过连接WordPress插件hook(钩子)来实现各种效果。以下是WordPress插件钩子的工作方式:在WordPress的不同运行时段,WordPress会检查此时是否有插件记录了需要运行的函数,如果有,WordPress会运行这些函数。这些函数改变了WordPress的默认运行状态。
例如,WordPress将日志标题显示到网页上之前,会首先查看是否有插件为一个名为 "the_title"的过滤器钩子记录函数。如果有,被记录的函数会解析日志标题,然后在网页上显示最终解析结果。因此,如果我们的插件需要在日志标题中加入一些信息,插件可以事先记录 "the_title"过滤器函数。
这里另一个例子是一个名为"wp_footer"的动作钩子。WordPress在所生成的HTML页面尾部检查是否有插件为"wp_footer"动作钩子记录函数,如果有,WordPress会逐个运行这些函数。
插件API中介绍了为过滤器钩子和动作钩子记录函数的方法,以及WordPress中可用的插件钩子。如果我们希望在WordPress代码中的某个地方加入WordPress没有的过滤器或动作,我们可以向WordPress团队提出我们的意见(一般情况下WordPress团队都会接受这些意见),意见提交过程参见提交Bugs。
模板标签
WordPress插件还可以通过创建自定义的模板标签来扩展WordPress的功能。有些用户希望插件能够将“标签”添加到他们的主题、侧边栏、日志正文等适当的地方。例如,如果某插件能够为日志添加地理标签,该插件可以为侧边栏定义一个名为geotag_list_states()的模板标签函数,让侧边栏显示出所有具有该标签的日志的状态,并且每个状态都能链接到由该插件激活的、相同状态的日志存档页面。
我们要定义某个自定义的模板标签,只要在插件的主页和/或插件主PHP文件上为用户编写一个PHP函数和相应的文档说明就可以了。如果能在文档说明中给出一个示例,准确说明需要添加到主题文件中的内容,对用户来说就更方便了。
将插件信息保存到数据库中
大多数WordPress插件都需要获取一些网站管理员/博客用户的输入信息,然后保存这些信息,必要时用在过滤器函数、动作函数和模板函数中。为了保证信息的一致性,我们要把这些信息保存在WordPress的数据库中。有几种简单方法可以将插件信息保存到数据库中:
1. 使用WordPress的“设置”功能(下文有介绍)。存放少量相关静态、特定数据类型(即首次设置插件时,我们所规定的网站管理员输入的数据类型,设置之后基本不会被改动)时,可以采用这种方法。
2. 使用Post Meta (又称自定义字段)。这种方法适用于单篇日志、页面和附件相关数据。参见post_meta 函数示例,,add_post_meta,以及其它相关函数。
3. 创建一个全新的定制数据库表。这个方法适用于与单篇日志、页面、附件或者评论相关的数据,这种数据类型会随着时间的推移而发展,没有属于自己的名称。更多信息参见用插件创建数据库表。
WordPress设置功能
如何创建一个可以自动保存用户设置的页面,请看创建选项页面。
WordPress有一套自用机制,可以在数据库中保存、更新、检索个人信息以及规定数据块(选项/设置)。这些选项值可以是字符串、数组或者PHP对象(这些PHP对象会被“序列化”,也可能在存储前被转换成字符串,检索时再恢复被“序列化”前的状态)。选项名称由字符串组成,并且选项名称必须是唯一的,这样才不会与WordPress或其它插件相冲突。
插件可以用以下函数来获取WordPress的选项。
add_option($name, $value, $deprecated, $autoload);
创建一个新选项;如果选项已存在,不进行其它任何操作。
$name
必需(字符串)。添加选项名称。
$value
可选(字符串),默认值为空字符串。存储选项值。
$deprecated
可选(字符串),WordPress已弃用该参数,用户如果需要使用$autoload参数,可以为$deprecated传递一个空字符串或零。
$autoload
可选,默认值为'yes'(列举类型:'yes'或'no')。若默认值为'yes',get_alloptions函数会自动检索选项情况。
get_option($option);
从数据库中检索选项值。
$option
必需(字符串)。希望返回其值的选项名称。在WordPress的常用选项中可以找到一个默认选项列表。
update_option($option_name, $newvalue);
在数据库中更新或生成某个选项值(注意:如果不使用$deprecated或$autoload参数,就没有必要调用add_option)。
$option_name
必需(字符串)。更新选项名称。
$newvalue
必需。(字符串 | 数组 | 对象)选项的新值。
控制面板
假设目前插件中有些选项存储在WordPress数据库中(参见上文),这时我们可能需要创建一个管理界面,以便用户查看、编辑插件的选项值。具体创建过程参见定制插件管理菜单。
插件国际化
插件编写完毕后,接下来就应该考虑推广插件了,我们可以将自己开发的插件国际化。首先要将插件本地化,然后再将插件翻译成不同语言。WordPress遍及全球,因此WordPress结构本身以及插件都需要实现本地化、国际化。
将我们的插件翻译成不同语言版本,让不同国家的用户都可以使用我们自己开发的插件,这也是一种插件推广方法。I18n for WordPress Developers向读者介绍了怎样进行软件国际化,其中一个版块详细描述了如何国际化WordPress插件。
插件开发建议
以下是一些关于插件开发的小建议。
- WordPress插件代码应符合WordPress编码标准,以及内嵌文档规则。
- 插件中所有函数名称都应该是唯一的,不能与WordPress核心文件、主题、其它插件中的函数名称相冲突。因此,我们可以为插件中的函数使用独一无二的函数名前缀。还可以在类(类名也应该是唯一的)中定义插件函数。
- 不要将WordPress数据库表前缀(通常是"wp_")硬编码到插件中,使用$wpdb->prefix变量来代替。
- 读取数据库数据非常方便,但为数据库写入数据却有些困难。数据库能够快速获取数据,然后将数据返回给用户。但更改数据库却是一个很复杂的过程。因此我们要尽量将数据库的写入信息量减少到最低点。可以事先在代码中准备好所有写入数据,然后写入数据库时就方便多了。
- 即使数据库存取数据的速度极快,我们也应该只向数据库请求必要信息,不要为数据库增加额外负担。如果要计算某张表中的行数,不要使用SELECT * FROM,这会查找出所有行中的所有数据,占用内存。同样的,如果插件只需要用到post_id和post_author,为了减少数据库的负担,我们也只需要选定这些指定字段。记住:同一时段可能还有很多其它程序需要调用数据库。数据库和服务器用有限的资源为计算机上所有程序服务。减少插件对服务器不必要的请求,可以保证这些资源能够被更合理地利用。
- 清除插件中的PHP错误。在wp-config.php文件中添加define('WP_DEBUG', true); ,测试插件的所有功能,检查插件是否出错。如果有错误请及时修正并将插件标记为“debug”状态,直到错误修正完毕。
分类:中文手册