你现在的位置:首页 > PHP网站建设知识库 > WordPress > 正文

WordPress源码设计解读

Wordpress是一个比较流行的博客CMS,并且不依赖于第三方框架。最近阅读了它的源码,大体了解了它的整体设计实现,下面我做一些总结。我选取的是2.0版本,虽然比较旧,但总体代码量会少一些,也不会影响对整体流程的了解。

一、原理

WordPress是一个CMS,区别于博客的是它带有博客管理功能,方便使用者发布和管理他的博客文章。它整个是基于PHP语言的,当用户通过浏览器访问WordPress时,Web后台的处理流程如下:

1)apache服务器接收到进来的http请求,执行用户所要访问的目录和文件,当发现是用户访问的是php文件时,调用apache的php模块来执行这个文件。

2)php文件被执行,解析用户http请求参数,访问本地mysql数据库,按照业务逻辑进行处理,最后组装web页面。

3)php模块把生成的web页面返回给apache服务器,apache服务器再通过http响应返回给浏览器。

mysql数据库是内容,php处理代码是逻辑,生成的包含html/css/js的web页面是外观。

 

二、目录结构

我们先看一下WordPress的目录结构:

├─wp-admin               //配置管理页面目录

│ ├─images            //配置管理页面用到的图片目录

│ └─import             //从其他不同站点导入博客文章的处理代码目录

├─wp-content             //主题和插件目录

│ ├─plugins            //各个插件目录

│ │  └─akismet

│ └─themes            //各个主题目录

│      ├─classic

│      └─default

│          └─images

└─wp-includes            //博客主要处理逻辑代码目录

    ├─images            //表情图片目录

    │ └─smilies

    └─js                    //各种Javascript特效目录

        └─tinymce    //web在线编辑器

 

三、数据库表

整个博客系统主要是提供文章的攥写、检索、显示和管理等功能,这些都是围绕着数据库进行的,数据库包含的是整个网站内容的基础,基于这个基础之上才会有各式各样的业务逻辑。WordPress属于标准的LAMP架构,使用的数据库是mysql,先来看一下它所维护的数据库表:

mysql> show tables;

+---------------------+

| Tables_in_wordpress |

+---------------------+

| wp_categories       |        //存储文章的分类信息

| wp_comments       |              //存储文章的回复信息

| wp_linkcategories    |        //存储链接的分类信息

| wp_links            |       //存储博客链接

| wp_options          |       //存储博客的配置选项

| wp_post2cat         |              //存储从文章到分类的对应关系

| wp_postmeta         |      //存储文章的特有数据

| wp_posts            |      //存储博客文章

| wp_usermeta         |      //存储用户的特有数据

| wp_users            |      //存储用户配置信息

+---------------------+

10 rows in set (0.00 sec)

 

四、代码处理流程

下面按照代码,走读一下请求的处理流程。index.php是博客首页,它只引入文件wp-blog-header.php,wp-blog-header.php文件包含三个主要的处理步骤:

1)引入文件wp-config.php。

2)触发主处理函数wp()。

3)引入文件template-loader.php。

在第1)步里,wp-config.php会引入wp-settings.php,wp-settings.php里会引入一系列的辅助功能模块,并相应的初始化,为后续的处理做好准备,比如:

wp-db.php(数据库操作)

cache.php(缓存系统)

functions.php(辅助功能)

default-filters.php(增加默认过滤器)

wp-l10n.php(国家语言)

。。。。

在第2)步里,wp()会调用下面的主要处理步骤:

function main($query_args ='') {

        $this->init();

        $this->parse_request($query_args);

        $this->send_headers();

        $this->query_posts();

        $this->handle_404();

        $this->register_globals();

}

$this->init();获取用户信息,初始化。

$this->parse_request($query_args);把用户http请求行参数解析成一个关联数组query_vars。

$this->send_headers();先返回相应的必要头域给apache服务器。

$this->query_posts();根据http请求参数查询mysql数据库表并返回结果。

$this->handle_404();如果结果不存在时直接返回404响应。

$this->register_globals();保存处理结果到全局变量。

在第3)步里,会根据前一步的处理结果来分别进行判断,判断需要返回的是哪种页面,比如文章、网页、分类还是归档等,然后调用相应主题的页面模板,生成响应页面。

另外,配置管理页面的处理流程大体都是先通过引入文件wp-config.php包含各种辅助功能模块,然后调用辅助功能函数从mysql数据库获取数据,生成显示页面,或者获取页面表单输入,再调用辅助功能函数把数据写入mysql数据库。

 

五、一些重要的概念

1、主题(themes)提供了一种页面显示的定制机制,是指WordPress对于主要的显示页面,可以让二次开发者通过主题去定制,主题可以包含任意数量的可定制页面,如果某个页面在当前用户主题中没有,就用会使用默认主题中的相应页面。

2、插件(plugins)提供了针对二次开发者的博客功能可扩充机制,是WordPress在处理流程的各个节点,定义了大量的标签,可以让二次开发者通过add_action调用的方式,对某些标签添加处理函数,从而在这些标签执行时会执行二次开发者嵌入的处理函数,完成插件功能。另外也可以通过调用add_submenu_page添加菜单项,在添加的菜单项被点击时触发相应的插件处理函数。

3、过滤器(filter)提供了针对特定标签的字符串过滤修改机制,通过add_filter添加指定标签的过滤规则,在需要使用的地方通过apply_filters来应用指定为标签注册的过滤函数,完成字符串的过滤修改。

4、WordPress使用了大量的全局变量,很多函数都有定义,因为php是单线程的,所以全局变量之间不用考虑互斥处理。

5、tinymce是WordPress使用的一个开源web在线编辑器,具有所见即所得的特点。它没有使用常用的execCommand来完成格式修改,而是采用获取选中的html、修改样式、替换掉选择的html的步骤方式来实现的。

6、WordPrees没有依赖apache自带的重写功能,而是自己实现了一套重写机制,对请求的网页参数按照配置的格式进行重写,主要在类WP_Rewrite进行处理。