接触wordpress已经有两三年的时间了,之前也有根据自己的需求整合过几个插件,如《WP插件:Best Slugs》;随着wordpress的版本更新和google取消了translate的免费API,该插件也已失去了其利用价值;
wordpress的版本现在已经更新到了3.2.1,而且3.3的开发计划好像也已经出了。不断更新的最新版本中,对插件机制的接口支持程度也越来越高了。灵活开发、灵活应用体现得越来越淋漓尽致。为了不致于太落伍,今天特意静下心来补习一下wordpress插件的几点基础知识。
关于wordpress plugin
什么是wordpress插件?Wordpress插件是一个能够扩展WP博客功能的PHP脚本程序和函数集。通过wordpress插件API(应用程序接口)提供的数据接口和方法,可以对博客进行一系列特色功能或服务的定制。[Writing a Plugin]
编写插件前的基础
编写一个优质的插件需要我们具备的东西太多,而在成为一个优质的插件作者之前,应该先了解一下wordpress的插件组成:插件的名称、插件的文件、插件的位置。
插件名称:Plugin Name
这个不难理解,就像自家的娃,必须拥有自家的姓名一样;给孩子起一个独一无二,能够强调个性,而且让人一眼就能看出你用意的名字;这是起名的几个基本出发点,也是是进行编写插件前的第一件事。你可以到官方插件库中,或通过baidu、google去验证你起的名是不是唯一的,这样有助于你的插件得以被普遍应用。
插件文件:Plugin Files
1、主文档(入口文件,我习惯性地称之为入口文件)
利用PHP创建一个唯一的、区别于其他文件的入口文件,是接下来要做的。众观大多数比较知名的插件,其入口文件的名称大多与插件名称一致。比如插件名称为“wp-pagenavi”的入口文件名为“wp-pagenavi.php”(wp-pagenavi是一个被广泛使用的分页插件);
除了入口文件外,插件中可能还包括Javascript文件、CSS文件、图片文件、语言文件等。这些分拆出来的文件,你可以根据你的喜好排放,使用时只需通知用户将整个插件文件夹存放到wp-content/plugins/目录下即可,这就是插件的位置。
2、入口文件的文件头
入口文件的文件头必须包括一个标准的插件信息头,这是wordpress判断该插件是否存在的重要依据。没有该信息头,插件无法激活,也就不可能被利用。信息头的基本格式:
/* 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管理界面里的一些组成因素。我想大多数插件作者还是乐意花时间去整理这几行代码的。
3、入口文件里的许可证说明
对于许可证,我还真不怎么了解,只是大多数插件都会在文件头加上这些说明。
另外如果想详细了解wordpress所用的GPL许可证,可点击这里前往详查看。
Readme文件
这不是必须的,但倘若出于协同编辑或便于插件推广,readme文件却可以提供帮助。而且官方明确要求,任何开发的插件若想被收录至官方插件库中的话,都必须遵循readme的格式编写readme.txt文件。[readme.txt]
关于文件的结构
刚才有提到,插件除了入口文件、readme.txt文件,还可能会包含Javascript文件、CSS文件、图片文件、语言文件等,这些文件可以按照你的习惯和喜好,任意地去组织。作为我个人,还是较喜欢wp-e-commerce插件作者的文件结构。wp-e-commerce是比较知名的电子商务类插件之一。
他的文件结构如图:
有了以上几点准备工作,接下来就要着手编写插件了。
wordpress插件API里介绍了为过滤器和动作钩子记录函数的方法,以及WordPress中可用的插件钩子。在着手编写插件之前,了解这些可用的过滤器和动作钩子,是必修的课程。
关于钩子、动作和过滤器
wordpress用钩子将插件“勾进”wordpress系统中,让插件与wordpress相连接,也就是说,通过钩子,wordpress能够在特定时间内调用插件中的函数,让插件开始运行。
动作(Actions)的概念和简单应用
在系统运行的某些特定时间点或发生特定事件时,wordpress核心程序会调用一些钩子。这里wordpress所调用的钩子被称为“动作”。插件用动作API来指定在上述特定时间点内需要执行的PHP函数。
查看wordpress中所有的动作钩子,移步至:List of all WordPress action hooks
应用:自wordpress3.1开始,已经可以很方便地修改左侧菜单,比如我不想让我的客户具备themes切换功能。
add_action( 'admin_menu', 'joker_mod_admin_menu' ); function joker_mod_admin_menu() { remove_menu_page('themes.php'); }
过滤器(Filters)的概念及简单应用
wordpress将不同类型文本添加到数据库或发送给浏览器窗口前,需要调用一些钩子来修改上述不同类型文本。这里wordpress所调用的钩子被称为“过滤器”。通过使用过滤器API,插件可以执行一个或多个PHP函数以修改上述不同类型文本。
查看wordpress中所有的过滤器,移步至:List of all WordPress filter hooks
应用:
add_filter( 'admin_footer_text', 'joker_admin_footer_text' );
function joker_admin_footer_text( $default_text ) {
return '
这段代码的作用是用来改变wordpress后台页脚默认的说明文字。
也许以上这两段代码,对于初学者来讲并不容易理解。不过这没事,只需培养一种感觉,和理解什么是过滤器和动作钩子,这会为以后无论是插件开发还是皮肤制作,都会提供帮助的。
另外,可以移步至我之前提到的《实用工具:PHPXref试用笔记》一文,尝试自己制作一份wordpress源码阅读文档。这样可以更有利于自己在wordpress学习过程中直接快速地查看和理解源码。
数据交互
如何将插件的配置信息保存到数据库?
options表主要用来存放少量相关静态、特定数据类型(即首次设置插件时,我们所规定的网站管理员输入的数据类型,设置之后基本不会被改动);
官方教程中简单介绍了利用add_options、update_options、get_options来设置和获取配置信息。
具体如下:
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 必需。(字符串 | 数组 | 对象)选项的新值。
如何通过Post meta扩展自定义自段
可以通过add_post_meta、update_post_meta等函数对单篇日志、页面和附件进行自定义字段的扩展与维护。
具体代码示例可以查看官方post_meta 函数示例
以上是几点关于wordpress插件的几点基础知识,想要了解或是制作插件,所要了解的远不止这些。起好步,练好技术才是关键。最后再来看看官方提到的插件开发的几点建议:
WordPress插件代码应符合WordPress编码标准,以及内嵌文档规则。
插件中所有函数名称都应该是唯一的,不能与WordPress核心文件、主题、其它插件中的函数名称相冲突。因此,我们可以为插件中的函数使用独一无二的函数名前缀。还可以在类(类名也应该是唯一的)中定义插件函数。
不要将WordPress数据库表前缀(通常是”wp_”)硬编码到插件中,使用$wpdb->prefix变量来代替。
读取数据库数据非常方便,但为数据库写入数据却有些困难。数据库能够快速获取数据,然后将数据返回给用户。但更改数据库却是一个很复杂的过程。因此我们要尽量将数据库的写入信息量减少到最低点。可以事先在代码中准备好所有写入数据,然后写入数据库时就方便多了。
即使数据库存取数据的速度极快,我们也应该只向数据库请求必要信息,不要为数据库增加额外负担。如果要计算某张表中的行数,不要使用SELECT * FROM,这会查找出所有行中的所有数据,占用内存。同样的,如果插件只需要用到post_id和post_author,为了减少数据库的负担,我们也只需要选定这些指定字段。记住:同一时段可能还有很多其它程序需要调用数据库。数据库和服务器用有限的资源为计算机上所有程序服务。减少插件对服务器不必要的请求,可以保证这些资源能够被更合理地利用。
清除插件中的PHP错误。在wp-config.php文件中添加define(‘WP_DEBUG’, true); ,测试插件的所有功能,检查插件是否出错。如果有错误请及时修正并将插件标记为“debug”状态,直到错误修正完毕。
参考资料:
http://codex.wordpress.org/Writing_a_Plugin
http://www.wordpress.la/codex-%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91.html