0%

WordPress运行流程分析

WordPress运行流程分析

QQ群:397745473

WordPress页面加载流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
整个wp的程序结构比较特别,也不象一些普通的面向过程,也不是MVC,总之就是他自己的程序结构。

在模板前面的程序基本上都是公共处理,但是把post的查询的逻辑处理放在公共处理中。因为整个wp的页面基本上都有查询post。

其它的逻辑操作基本上是在模板中调用的(比如评论),所以它的模板并不是单纯的V,可以算是C+V。

WordPress页面加载流程:
程序入口index.php文件
└加载wp-blog-header.php文件
├加载wp-load.php文件:初始化,建立WordPress上下文环境
│ └加载wp-config.php文件
│ └加载wp-settings.php文件:加载WordPress相关的API,约62个文件
│ ├加载加载WordPress必须的函数,包含很多与常量初始化相关的函数
│ ├加载与版本相关的全局变量
│ ├初始化默认常量
│ ├检查PHP和MySQL的版本
│ ├禁用magic quotes
│ ├设置时区
│ ├关闭register_globals
│ ├修正服务器变量
│ ├favicon
│ ├检查是否处于维护状态
│ ├计时器开始
│ ├检查是否处于调试状态
│ ├设置缓存相关信息
│ ├设置语言文件所在的路径
│ ├加载文件
│ ├加载数据库操作相关文件
│ ├设置wpdb
│ ├设置对象缓存
│ ├加载多站点相关的文件
│ ├注册shutdown_action_hook
│ ├如果只使用基本功能,加载到此结束(退出)
│ ├检查WordPress如果没有安装,则进入安装流程
│ ├加载更多的文件
│ ├加载多站点相关的文件
│ ├设置与插件相关的常量,加载插件
│ ├do_action('muplugins_loaded'):无默认函数绑定
│ ├设置与cookie相关的常量
│ ├设置与SSL相关的常量
│ ├加载文件
│ ├创建初始分类
│ ├创建post类型
│ ├设置默认主题文件路径
│ ├加载激活的插件
│ ├加载可以被注入的插件函数
│ ├设置编码方式
│ ├载入缓存
│ ├do_action('plugins_loaded'):wp_maybe_load_widgets,wp_maybe_load_embeds
│ ├初始化与功能相关的常量
│ ├初始化magic_quotes
│ ├do_action('sanitize_comment_cookies'):sanitize_comment_cookies
│ ├初始化一些全局常量
│ ├do_action('setup_theme'):无默认函数绑定
│ ├初始化与模板相关的常量
│ ├初始化语言设置
│ ├初始化主题自带的函数
│ ├do_action('after_setup_theme'):无默认函数绑定
│ ├设置当前用户信息
│ ├do_action('init'):check_theme_switched,wp_cron,smilies_init,_show_post_preview
│ ├检查站点状态,如果是多站点,需要额外加载文件
│ └do_action('wp_loaded'):无默认函数绑定
├调用wp()函数:调用WP-main()方法,内容处理
│ ├初始化
│ ├解析参数
│ ├发送HTTP头
│ ├查询Post
│ ├处理404的情况
│ └注册全局变量
└加载template-loader.php文件:应用主题并渲染内容
├处理不使用主题的情况
├处理HEAD请求
├处理robot,feed,trackback请求
└选择模板文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
wp-settings.php文件加载的主要API:
(01)wp-includes/load.php:加载WordPress需要使用的函数
(02)wp-includes/wp-db.php:与数据库相关
(03)wp-includes/default-constants.php:默认常量
(04)wp-includes/version.php:WordPress的版本号
(05)wp-includes/advanced-cache.php:与缓存相关
(06)wp-includes/compat.php:为了兼容特殊PHP版本的函数
(07)wp-includes/functions.php:核心函数
(08)wp-includes/class-wp.php:核心类WP
(09)wp-includes/class-wp-error.php:WP_Error
(10)wp-includes/plugin.php:插件机制核心逻辑
(11)wp-includes/pomo/mo.php:多语言处理
(12)wp-includes/default-filters.php:系统默认的action和filter
(13)wp-includes/ms-blogs.php:blog相关API(多站点)
(14)wp-includes/ms-settings.php:设置并加载一些多站点相关API(多站点)
(15)wp-includes/l10n.php:多语言处理
(16)wp-includes/class-wp-walker.php:Walker类,树型结构迭代器
(17)wp-includes/class-wp-ajax-response.php:WP_Ajax_Response类,处理AJAX
(18)wp-includes/formatting.php:字符串格式化处理函数
(19)wp-includes/capabilities.php:WordPress的用户和组相关类
(20)wp-includes/query.php:WP_Query相关逻辑
(21)wp-includes/date.php:WP_Date_Query相关逻辑:产生与日期相关的查询条件
(22)wp-includes/theme.php:主题、模板、样式表相关函数
(23)wp-includes/class-wp-theme.php:WP_Theme类
(24)wp-includes/template.php:模板加载相关函数
(25)wp-includes/user.php:用户信息相关函数
(26)wp-includes/meta.php:Metadata相关API
(27)wp-includes/general-template.php:通用的模板标签
(28)wp-includes/link-template.php:与permalink相关的标签
(29)wp-includes/author-template.php:与author相关的标签
(30)wp-includes/post.php:post相关函数
(31)wp-includes/post-template.php:post相关标签
(32)wp-includes/revision.php:post_revision相关函数
(33)wp-includes/post-formats.php:与post_format相关的函数
(34)wp-includes/post-thumbnail-template.php:post_thumnail相关函数与标签
(35)wp-includes/category.php:category相关函数
(36)wp-includes/category-template.php:category相关API和标签
(37)wp-includes/comment.php:comment相关API
(38)wp-includes/comment-template.php:comment相关标签
(39)wp-includes/rewrite.php:rewrite相关API
(40)wp-includes/feed.php:feed相关API
(41)wp-includes/bookmark.php:bookmark相关API
(42)wp-includes/bookmark-template.php:bookmark相关标签
(43)wp-includes/kses.php:HTML/XHTML过滤器
(44)wp-includes/cron.php:定时任务
(45)wp-includes/deprecated.php:一些过期函数
(46)wp-includes/script-loader.php:scripts和styles加载
(47)wp-includes/taxonomy.php:taxonomy相关API
(48)wp-includes/update.php:更新升级相关API
(49)wp-includes/canonical.php:重定向
(50)wp-includes/shortcodes.php:bbcode相关
(51)wp-includes/class-wp-embed.php:多媒体内容嵌入
(52)wp-includes/media.php:多媒体显示
(53)wp-includes/http.php:HTTP请求
(54)wp-includes/class-http.php:WP_Http类
(55)wp-includes/widgets.php:widget相关
(56)wp-includes/nav-menu.php:导航菜单相关
(57)wp-includes/nav-menu-template.php:导航菜单相关
(58)wp-includes/admin-bar.php:个人信息头
(59)wp-includes/ms-functions.php:多站点相关
(60)wp-includes/ms-default-filters.php:多站点相关
(61)wp-includes/ms-deprecated.php:多站点相关
(62)wp-includes/vars.php:WordPress最后的全局变量
(63)wp-includes/pluggable.php:可覆盖的函数
(64)wp-includes/pluggable-deprecated.php:可覆盖的函数(过期)
(65)wp-includes/locale.php:WP_Locale类,地理位置(日期与时间)相关

WordPress管理页面加载流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
程序入口wp-admin/index.php文件
├加载admin.php文件
│ ├定义一些与admin相关的常量
│ ├加载wp-load.php文件:建立WordPress上下文环境(详细过程如前所述)
│ ├处理HTTP头:去掉Last-Modified域
│ ├处理数据库更新
│ ├加载wp-admin/includes/admin.php文件:加载所有的与管理页面相关的API,约20个文件
│ ├检查用户是否登录
│ ├垃圾回收、屏幕设置等
│ ├处理请求参数
│ ├加载wp-admin/menu.php文件:生成menu数据
│ │ └加载wp-admin/includes/menu.php文件:设置menu数据
│ ├admin页面初始化完成
│ ├设置当前显示界面
│ ├处理插件内页面
│ └处理admin_action相关回调
├加载wp-admin/includes/dashboard.php文件:dashboard页面逻辑
├设置dashboard
├初始化页面样式表、JS脚本、标题、帮助信息
├加载wp-admin/admin-header.php文件
│ ├发送HTTP头
│ ├从Cookie中获取用户信息
│ ├渲染HTML头部内容
│ ├渲染[title]的内容
│ ├设置css和javascript相关标签内容
│ ├渲染一些[head]标签的内容
│ ├ss和javascript相关标签内容(通过action)
│ ├加载wp-admin/menu-header.php文件:渲染菜单
│ └渲染页面[body]框架的前面部分
├渲染主体内容(本例是dashboard)
├渲染页面[body]框架的后面部分
└加载wp-admin/admin-footer.php文件:渲染页脚

wordpress工作原理

1
2
3
4
5
6
在了解WordPress挂载机制时,一直有一个疑惑,到底是WordPress的内核源文件先执行还是主题文件里functions.php文件先执行。为了解决这个问题,想了解WordPress的工作原理,它是如何生成网页的,各程序文件的执行顺序是什么,于是有了这篇文章。
http://bian2013.com/breads/appam-hoppers/

WordPress所有的前端页面生成都要经过根目录下的index.php文件(不是主题根目录),这是通过Web服务器的rewrite规则实现的。
然后通过index.php文件一步步引导WordPress环境启动,再分析请求URL返回相应数据所组成的前台页面。
以下将一步步分析源码文件,以此来了解WordPress整体框架及工作原理。

wordpress执行流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
第一步:加载index.php
该文件有效源码如下:
define('WP_USE_THEMES', true);
# 定义是否加载主题文件,true为加载;
require('./wp-blog-header.php');
# 加载wp-blog-header.php文件,该文件用于启动WordPress环境及模板;

第二部: 加载wp-blog-header.php文件。
if ( !isset($wp_did_header) ) {
$wp_did_header = true;
require_once( dirname(__FILE__) . '/wp-load.php' );
wp();
require_once( ABSPATH . WPINC . '/template-loader.php' );
}

解析1:对$wp_did_header进行赋值,这样如果代码块已经执行过,判断就会失败,代码块就不会再执行。这种做法可以确保wp-blog-header.php文件只执行一次(重复执行的话会出现函数名冲突、变量重置等,WordPress会精神分裂的!);

解析2:加载WP根目录下wp-load.php文件,执行 初始化工作,如初始化常量、环境、加载类库和核心代码等完成WordPress环境启动工作,如加载wp-includes目录下functions.php(函数库)、class-wp.php(类库)、plugin.php(插件)、pomo目录(语言包)、query.php(数据请求)、theme.php(加载主题文件)、post-template.php(文章模板)、comment.php(评论模板)、rewrite.php(URL重写)等等。

解析3:执行wp()函数,执行 内容处理工作,如根据用户的请求调用相关函数获取和处理数据,为前端展示准备数据;

解析4:加载根目录绝对路径下wp-includes目录中template-loader.php文件,执行 主题应用 工作,如根据用户的请求加载主题模板。

WordPress之所以能将用户请求的页面生成出来,都是最后这三行核心代码起的作用。wp-load.php会完成页面生成所需要的所有环境、变量、API等,相当于做了好准备工作;wp()函数根据用户请求的URL从数据库中取出相应的数据内容备用;template-loader.php把已经准备好的内容用主题所设定的样式展现方式给拼接出来。这三项工作完成,就可以将用户请求的页面展现出来了。我们姑且将这三项工作也认定为三个大步骤,以下将重点分析。

第三步:加载wp-load.php文件(初始化)
该文件初始化常量(如:定义绝对路径、设定功能文件及内容文件路径等)并加载wp-config.php文件,
加载wp-config.php文件:该文件主要用于配置MySQL数据库通信信息、设定数据库表名前缀、设定密钥、设置语言及文件绝对路径等,部分核心代码如下(为省事就直接在代码后加#然后解释含义了)
wp-config中还加载了一个重要的文件:wp-settings.php。

wp-settings.php: 主要用于创建和定义常见变量、函数和类的库来为WordPress运行做准备,也就是说WordPress运行过程中使用的大多数变量、函数和类等核心代码都是在这个文件中定义的。这个文件相当于一个总控制器,很多常量定义、函数定义等都是在其他文件中完成,而该文件的作用就是执行那些文件或执行在那些文件中已经定义好的函数。

第四步: 执行wp()函数(内容处理)
在这一阶段,调用wp()函数对数据库内容进行查询,并将查询的内容赋值给一些全局变量,方便在模板中使用模板标签获取相应的数据并展示在前端。
第五步:加载template-loader.php文件(主题应用)
该文件根据用户URL返回加载相应模板

QQ群:397745473

欢迎关注我的其它发布渠道