很久之前建了一个博客,使用的是Wordpress这个程序,除了有很多的主题皮肤以外,发现他的插件机制实现的也非常好。
在我玩PHPWind的时候,如果想对逻辑,页面的进行一些调整,必须要动手该程序或者页面模板。
所以Wp的实现机制很吸引人,正好有个机会可以学习研究下WP的插件机制了。
WP中定义了很多“钩子”,或者说系统事件(Action Tag).插件就是需要扩展这些系统事件。
比如说一个钩子"admin_head"表示了后台管理页面的Header部分,使用add_action('admin_head','my_function');就可以将一个自定义的函数与这个钩子挂接。
这个大概就是wp插件的实现机制。
下面通过分析一些诸如"Hello Dolly"等插件,研究下Wp的插件机制以及制作的方法。
1.版权
/*
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/#
Description: This is not just a plugin.........
Author: Matt Mullenweg
Version: 1.5
Author URI: http://photomatt.net/
*/
这是一段版权的声明。
Wp用通过函数 正则把里面的内容解析出来
下面是函数的部分代码:
1 $plugin_data = implode( '', file( $plugin_file ));
2 preg_match( '|Plugin Name:(.*)$|mi', $plugin_data, $plugin_name );
3 preg_match( '|Plugin URI:(.*)$|mi', $plugin_data, $plugin_uri );
4 preg_match( '|Description:(.*)$|mi', $plugin_data, $description );
5 preg_match( '|Author:(.*)$|mi', $plugin_data, $author_name );
6 preg_match( '|Author URI:(.*)$|mi', $plugin_data, $author_uri );
只有是版权,版本等按照Hello Dolly的例子就可以被wp所解析出来了
2.添加菜单
添加菜单的函数有大概如下几个
选项
add_options_page(page_title, menu_title, access_level/capability, file, [function]);
管理
add_management_page(page_title, menu_title, access_level/capability, file, [function]);
主题
add_theme_page( page_title, menu_title, access_level/capability, file, [function]);
顶级菜单(一般不推荐)
add_menu_page(page_title, menu_title, access_level/capability, file, [function]);
这些函数都是由函数add_submenu_page封装而来
add_submenu_page( parent, page_title, menu_title, access_level, file, [function] )
下面是wp自带插件akismet的框架
function akismet_init() {
add_action('admin_menu', 'akismet_config_page');
}
add_action('init', 'akismet_init');
function akismet_config_page() {
if ( function_exists('add_submenu_page') )
add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
}
这个在插件管理页面添加了一个子菜单
通过其他函数我们可以向其他菜单添加子菜单
从这里我们也可以看到插件的实现机制
add_action('init', 'akismet_init');
这里调用akismet_init()初始化了akismet插件
还通过
add_action('admin_menu', 'akismet_config_page');
给管理菜单添加了一级子菜单。