菜单

wordpress插件原理

2010年09月1日 - wordpress

WordPress的插件机制使得开发者可以方便地向系统添加自己需要的功能,而这是使得Wordpress得以在全世界流行的重要原因。一个 WordPress插件是一个程序,或者是用PHP脚本语言写出的一个或一些函数的集合,用来往WordPress Webblog 里增加一些特定的特征和服务,它们可以通过WordPress的 Plugin Application Program Interface (API) 提供的接入点和函数无缝的集成到Webblog里.

插件机制的实现主要依靠wp-includes目录下的plugin.php文件,该文件中包含了与插件机制相关的几个函数。在 wordpress内核运行时设立了一些标记(tag),当遇到这些标记时,wordpess会自动调用挂载到 (hook to)这个标记上的所有函数,该功能是通过数组来实现的,其过程可以直观的表示为下图:

插件hook原理

用户可以通过plugin API方便的将自定义的功能添加到系统相应的位置。需要指出的是:wordpress定义了两种类型的插件API,行为(actions)和过滤器 (filters):

Actions: Actions are the hooks that the WordPress core launches at specific points during execution, or when specific events occur. Your plugin can specify that one or more of its PHP functions are executed at these points, using the Action API.

Actions 是由WordPress内核在执行过程中的特定的点或者特定的事件发生时调用的. 使用这些Action API,你的plugin可以指定在这些点去执行一个或者多个PHP函数.

Filters: Filters are the hooks that WordPress launches to modify text of various types before adding it to the database or sending it to the browser screen. Your plugin can specify that one or more of its PHP functions is executed to modify specific types of text at these times, using the Filter API.

Filters是一种hooks,由WordPress调用,针对于各种形式的文本,让它们在进入数据或发送到浏览器之前得到调整. 使用Filter API,你的插件可以指定在某个时间执行一个或者多个PHP函数来修改特定类型的文本.

一、一个最简单的插件的开发过程

下面以阿德弄的一个a_simple_song插件(其实跟自带的那个插件是一样的,只是修改了歌词而已)为例简述整个过程三个步骤:编写插件要执行的代码,添加add_action(),进入后台激活它。
该插件的功能是:在WordPress后台左上角随机显示《一首简单的歌》这首歌的歌词。
1.在wordpress目录/wp-content/plugins/下新建一个文件:a_simple_song。
2.用文本编辑工具打开它,输入<?php    ?>,接下来的工作就是在这里面填写相应PHP代码。
3.首先按一定的格式编写本插件的一些信息,WordPress读取它用于在后台显示,方便用户查看:

/*
Plugin Name: 一首简单的歌
Plugin URI: http://blog.黄博.com
Description: 这个插件会在后台随机显示《一首简单的歌》的歌词。
Author: demo
Version: 1.0
Author URI: http://blog.黄博.com
*/

4.编写要执行的操作:
$lyrics = “一首简单的歌    //定义了一个字符串数组用于存储歌词
这世界很复杂
………
你是我最珍贵的财富”;
$lyrics = explode(”\n”, $lyrics);
//explode()是PHP内置函数,功能就是分割字符串成字符数组
$chosen = wptexturize( $lyrics[ mt_rand(0, count($lyrics) – 1) ] );
/*
给chosen赋一条随机的歌词
wptexturize()在wp-includes\functions-formatting.php定义,功能:把某些特殊符号给自动转换化成标准码格式。
mt_rand()函数返回它2个参数之间的随机值
count()返回数组大小
*/
function a_simple_song() {
global $chosen;
echo “<p id=’dolly’>$chosen</p>”;
}
//dolly样式表由后面定义。
//显示歌词
5.添加add_action(),将a_simple_song函数hook到main_foot tag的队列中
add_action(’admin_footer’, ‘a_simple_song’);
//admin_footer.php被调用时执行这个函数
add_action(’admin_head’, ‘dolly_css’);
//admin_head.php被调用时执行dolly_css()
具体经过请参考下面的从源码解读a_simple_song插件的调用过程。

这样,保存为.php文件放到plugins文件夹下面,再到后台激活就可以了。效果如图

二、WordPress对所有可用的插件的读取

在文件/wordpress/wp-admin/plugins.php中,函数
<?php function get_plugins() ?>
用来从文件系统得到所有的插件。原理很简单,就是读取’wp-content/plugins’目录下的所有PHP文件。这个函数允许一级的子文件夹,也 就是说在’wp-content/plugins’下面的PHP文件,以及所有在此目录下的一级子文件夹内部的PHP文件被列作插件的候选,用下面的函数 去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。

foreach($plugins as $plugin_file => $plugin_data) {
….
$plugin_data[‘Title’]       = wp_kses($plugin_data[‘Title’], $plugins_allowedtags);
$plugin_data[‘Version’]     = wp_kses($plugin_data[‘Version’], $plugins_allowedtags);
$plugin_data[‘Description’] = wp_kses($plugin_data[‘Description’], $plugins_allowedtags);
$plugin_data[‘Author’]      = wp_kses($plugin_data[‘Author’], $plugins_allowedtags);
$author = ( empty($plugin_data[‘Author’]) ) ? ” :  ‘ <cite>’ . sprintf( __(’By %s’), $plugin_data[‘Author’] ) . ‘.</cite>’;
….
}

用于从插件的头部注释中获取插件的版本、名称、作者,等信息。

三、Active & Deactive Plugin(插件的激活与注销)

Active(Deactive)插件的操作都在Plugins.php中,比如我要ple_Deactive “a_simsong”这个插件,最后的URL其实是这个样子:

http://localhost/wordpress/wp-admin/plugins.php?action=deactivate&plugin=a_simple_song.php&_wpnonce=242c8cc3e5

其中,”Action”表示动作,值为”active”或者”deactivate”,而”Plugin”表示动作的对象插件,此处为”a_simple_song.php”。得到动作指令后,首先从数据库中取出当前已经激活的插件。

$active = get_option(’active_plugins’);

然后根据动作,重新生成已激活插件数组,和theme一样存入数据库,并重新加载此页。加载的时候就需要考虑这些已经激活的插件是怎么工作的了。

四、插件的加载过程

WordPress中的每页都会包含”wp-config.php”文件,而在”wp-config.php”的最后有这样一句:

<?php require_once(ABSPATH.’wp-settings.php’); ?>

在”wp-settings.php”文件中,可以找到以下与插件相关的代码片断:

if ( get_option(’active_plugins’) ) {
$current_plugins = get_option(’active_plugins’);
if ( is_array($current_plugins) ) {
foreach ($current_plugins as $plugin) {
if (” != $plugin && file_exists(ABSPATH . PLUGINDIR . ‘/’ . $plugin))
include_once(ABSPATH . PLUGINDIR . ‘/’ . $plugin);
}
}
}

可见,这段代码会取出系统中所有Actived的插件,并Include进来。所以在每页加载的时候,都会首先Include这些插件代码。这也就是为什么在主题模板里面可以直接调用插件的函数。

五、WordPress通过插件机制注册系统事件

WordPress中的很多功能也都是通过这种插件结构来实现的,WordPress默认注册的系统事件保存在default-filter.php中。比如:
<?php add_filter(’the_content’, ‘convert_smilies’); ?>
用来将正文(content)中的笑脸符号转换为图像。
add_filter(’comment_text’, ‘wptexturize’);
用来将从数据库提取的正文中的特殊符号转化成标准格式的。

六、从源码解读a_simple_song插件的调用过程

在每一个wordpress/wp-admin/下面的文件(也就是后台显示需要的文件)的前面都有
<?php require_once(’admin-header.php’); ?>

而在”admin-head.php”中将会执行扩展点”admin_head”的所有扩展:

<?php  do_action(’admin_head’, ”); ?>

这样,就会执行所有hook到admin_head上的函数
Admin Page的Footer部分同样如此,
<?php do_action(’admin_footer’, ”); ?>

这样,就会执行所有挂接到admin_footer的函数

a_simple_song里面有这么2行代码:

add_action(’admin_footer’, ‘a_simple_song’);
add_action(’admin_head’, ‘dolly_css’);

将控制形式和内容2个函数挂到不同的tag上,控制文字显示位置和样式的dolly_css是先被调用,然后admin_foot.php被调用一次,a_simple_song()也就被调用一次,来显示歌词。

发表评论

电子邮件地址不会被公开。 必填项已用*标注