Mar 30, 2007
wordpress目前非常流行一款开放源代码基于php,mysql的blog系统,尤其是她的插件机制更让人着迷。有很多wordpress插件的相关网站。
让我们来一起剖析她的插件机制的实现吧。
wordpress是怎么读取当前所有插件的?
wordpress的插件存放在wp-content\plugins目录下,可以直接存放在plugins或plugins的二级目录下。
登录后台进入Plugins栏目可以查看当前所有存在的插件相关信息。
以Hello Dolly插件为例。
wp的插件相关描述存放在php文件内容开始的地方
- /*
- 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 <CITE>Hello, Dolly</CITE> in the upper right of your admin screen on every page.
- Author: Matt Mullenweg
- Version: 1.5
- Author URI: http://photomatt.net/
- */
- // Files in wp-content/plugins directory
- // 读取系统插件目录中所有文件及文件夹
- $plugins_dir = @ dir($plugin_root);
- if ($plugins_dir) {
- while (($file = $plugins_dir->read()) !== false) {
- // 跳过当前目录 . 和上级目录 ..
- if (preg_match('|^\.+$|', $file))
- continue;
- // 如果当前句柄是目录,再循环读取当前目录下所有.php的文件
- if (is_dir($plugin_root.'/'.$file)) {
- $plugins_subdir = @ dir($plugin_root.'/'.$file);
- if ($plugins_subdir) {
- while (($subfile = $plugins_subdir->read()) !== false) {
- // 跳过当前目录 . 和上级目录 ..
- if (preg_match('|^\.+$|', $subfile))
- continue;
- // 如果是php文件则保存到$plugins_files数组中
- if (preg_match('|\.php$|', $subfile))
- $plugin_files[] = "$file/$subfile";
- }
- }
- } else {
- // 如果是php文件则保存到$plugins_files数组中
- if (preg_match('|\.php$|', $file))
- $plugin_files[] = $file;
- }
- }
- }
- foreach ($plugin_files as $plugin_file) {
- if ( !is_readable("$plugin_root/$plugin_file"))
- continue;
- // 读取每个插件的相关描述信息,见下
- $plugin_data = get_plugin_data("$plugin_root/$plugin_file");
- if (emptyempty ($plugin_data['Name'])) {
- continue;
- }
- $wp_plugins[plugin_basename($plugin_file)] = $plugin_data;
- }
- // ......
- // 所有插件相关描述信息就保存在这个数组里了
- return $wp_plugins;
- // 将每个php文件中内容读取到$plugin_data中,PHP4.3.0开始可用file_get_contents()来将文件读入到一个字符串返回。
- $plugin_data = implode('', file($plugin_file));
- // 用正则读出每个插件的名称、URL、描述、作者、版本等信息
- preg_match("|Plugin Name:(.*)|i", $plugin_data, $plugin_name);
- preg_match("|Plugin URI:(.*)|i", $plugin_data, $plugin_uri);
- preg_match("|Description:(.*)|i", $plugin_data, $description);
- preg_match("|Author:(.*)|i", $plugin_data, $author_name);
- preg_match("|Author URI:(.*)|i", $plugin_data, $author_uri);
- if (preg_match("|Version:(.*)|i", $plugin_data, $version))
- $version = trim($version[1]);
- else
- $version = '';
- // ......
- return array ('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template[1]);
wp-admin/plugins.php 调用 get_plugins() {} 方法显示所有插件,读取完毕。



本文相关评论|Comments