All Rights Reserved
Wordpress插件开发系列
一、Wordpress插件机制浅析
Wordpress 通过插件机制,使一套基于基本的 CMS 系统的博客系统有了很大的扩展能力。
第一、Wordpress 的插件与文件系统的接口为 wp-content\plugins 文件夹。接口主文件可以直接
放置在该文件夹下,如果牵涉的文件较多,也可以再建立一个文件夹,放在该文件夹下,该文件夹最好
与接口主文件的名字相同:如主接口文件为 myplugin.php,则文件夹名字可以为 myplugin。
插件大体上可划分为两个部分:前面是注释,注释下是代码区。
注释部分大体如下示例:
/*
Plugin Name: MyCopyright
Plugin URI: http://www.why100000.com
Version: 0.1
Author: gdfos
Author URI: http://blog.why100000.com
Description: 把字符串“<!--mycopyrigth-->”替换为版权信息:show copyright once there are
letters match “<!--mycopyrigth-->”.
不要简单的看待以上的注释,不是随便写的,是固定的格式,可看做是插件的元信息(meta)。冒
号前面的形如“Plugin Name”的信息都是有用的,作为插件的相关信息,会出现在系统设置等菜单下,
作为本插件的标识信息。冒号后面的信息可以根据需要改写。冒号连接的一行信息类似于表中的一条记
录,且不能换行。
再例如,Wordpress2.3.3 有个插件,其头部注释如下:
/*
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/#
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation
summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated
you will randomly see a lyric from
Hello, Dolly in the upper right of your admin
screen on every page.
All Rights Reserved
Author: Matt Mullenweg
Version: 1.5
Author URI: http://photomatt.net/
*/
第二、代码部分就复杂了。不过一般应该有类似 add_action('admin_footer', 'hello_dolly');的 PHP 代
码,也就是至少需要执行 add_action 函数,当 Wordpress 执行 admin_footer 系统函数的时候,执
行插件自定义的 hello_dolly 函数。hello_dolly 函数中就写有特点插件的逻辑。
大家可以去看插件 hello.php,很简单,功能是:当点击 Wordpress 后台管理的菜单项时,在页面
右上角随机出现一些类似“毛主席语录”的“口号”(插件的 Description 里准确描述了其功能)。插件
里有两处用了 add_action 函数:
add_action('admin_footer', 'hello_dolly');
add_action('admin_head', 'dolly_css');
分别执行了自定义函数 hello_dolly 和 dolly_css,用于显示信息和定义 CSS 样式。
第三、我模仿网络上的例子,写了一个最简化的 Wordpress 插件,全部代码如下:
";
$replace = "
本文由网眼原创。转载请注明原创作者 网眼(张庆) >"
功能是:把文章中的字符串“”替换为版权信息字符串。add_filter 其实是一
个回调函数,用于在 Wordpress 的 the_content 函数执行的时候,处理一些事务。具体意义参见自定
义 why100000_showcopyright 函数。
All Rights Reserved
用法:保存为一个 PHP 文件,拷贝到插件目录下,或见一个文件夹,拷贝到文件夹下。这样,在插
件管理界面里,就可以看见该插件的列表信息,点击“启用”使插件生效。然后,写博客的时候,在源
代码里添加注释,保存博客后,浏览博客,会看到该注释被替换成了红色字体的字
符串“本文由网眼原创。转载请注明原创作者:网眼(张庆)”,且包含一个链接。
这个简单的例子可以增加一些额外的功能,以使其更强大。
这仅仅是 WP 插件的应用层的知识。要进一步了解 Wordpress 的插件机制,需要阅读 Wordpress
的源代码。好在是开源的,应该从里面学到更多的经验和技巧。
二、Wordpress插件示例之一
这个 Wordpress 插件,除过能够在插件管理面板管理外(可以被开启和禁用),还能够在“设置”
菜单下对插件进行配置,使插件的功能可以得到扩展。本插件可以实现对博客文章中的任意字符串进行
替换。
以下代码中,why100000_keyword 和 why100000_replace 作为选项文本域标识变量,其值被
option.php 取到并保存到数据库的 wp_options 表中。
get_option("why100000_keyword") 和 get_option("why100000_replace") 语 句 用 于 从
wp_options 表中取出数据。
All Rights Reserved
MyCopyright is active.
MyCopyright Config (版权插件配置)
");
add_option("why100000_replace", "我的版本");
}
//WP 执行 the_content 函数时,调用插件自定义函数 why100000_showcopyright,对文章内容进行过滤
add_filter('the_content', 'why100000_showcopyright');
All Rights Reserved
}
?>
三、Wordpress插件示例之二-对示例一的重构
示例一已经完全可以工作了,这个在 Wordpress2.3.3 和 2.9.1 版本中已经得到证实。但示例一有几
个缺陷。
由于 Wordpress 的插件众多,全世界有很多程序员包括我们中国的程序员,都在为它开发插件,
这些插件往往被一起安装在一套 Wordpress 系统中协调工作,这未免会产生冲突的情况。
为了隔离各个插件的代码,我们需要想一些办法。而把插件代码封装在一个类结构中是个行之有效
的方法之一。正确应用一些
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
函数,可以保证只要插件类名不冲突,类所包含的成员函数就不会与其
它插件冲突。这大大增强了插件代码的健壮性。而且插件类名是否冲突也作为代码容错检测的一部分,
使系统不至于出现严重的崩溃。
请参看下面的一个完整的 Wordpress 插件代码,是参考以上考虑,对示例一的代码的完全重构。
MyCopyright Config (版权插件配置)
");
add_option("why100000_replace", "我的版本");
}
//WP 执行 the_content 函数时,调用该函数,对文章内容进行过滤
function why100000_showcopyright($content){
$search = get_option("why100000_keyword"); //"";
$replace= get_option("why100000_replace"); //代替的字符串;
$content= str_replace($search, $replace, $content);
All Rights Reserved
}
if (isset($MyPlugin)){
add_action('activate_mycopyright/mycopyright.php', array(&$MyPlugin,
'why100000_copyright_install'));
add_action('admin_menu', array(&$MyPlugin, 'why100000_add_options_page'));
add_filter('the_content', array(&$MyPlugin, 'why100000_showcopyright'));
}
?>
于是,我们归纳出一个相对完善的 Wordpress 插件代码书写构架:
弹出警告对话框,用样式表中的样式代码
改变其样式。文章末尾添加的文字,可以在插件设置面板里进行定制修改,比较灵活。
3、完整代码及其解释
要往文章中加入 CSS 代码,一种是直接打开 Wordpress 的 themes 有关模板文件直接添加,但仅
仅作用于这个模板页面。这样做可以系统的运行效率比较高,但不够灵活。而使用插件来实现,实现的
结果对所有的 themes 有效。
在 Wordpress 插件中使用样式表,主要使用了 add_head 这个 API 事件。
首先编辑 css.css 文件,内容如下:
#myalert{
background-color:#006;
color:#fff;
cursor:hand;
}
保存于 css 文件夹下。该段样式表可以按需要定制,但要确保不能与其它样式冲突,否则得不到预
期的结果。该段样式表代码对 id="myalert"的标签进行修饰。
然后定义插件类的成员函数 why100000_addHeaderCode(),输出引用样式表的标签。注意 css
文件的路径。函数完整代码如下:
function why100000_addHeaderCode(){
echo '
';
}
然后调用以下代码:
add_action('wp_head',array(&$MyPlugin_testcssjs, 'why100000_addHeaderCode'),1);
使生成文章页面 head 部分时,添加