WordPress工作原理之程序文件执行顺序
2016-07-20 14:27
267 查看
WordPress工作原理之程序文件执行顺序(传说中的架构源码分析)
在了解WordPress挂载机制时,一直有一个疑惑,到底是WordPress的内核源文件先执行还是主题文件里functions.php文件先执行。为了解决这个问题,想了解WordPress的工作原理,它是如何生成网页的,各程序文件的执行顺序是什么,于是有了这篇文章。WordPress所有的前端页面生成都要经过根目录下的index.php文件(不是主题根目录),这是通过Web服务器的rewrite规则实现的。然后通过index.php文件一步步引导WordPress环境启动,再分析请求URL返回相应数据所组成的前台页面。以下将一步步分析源码文件,以此来了解WordPress整体框架及工作原理。
第一步:加载index.php文件
该文件有效源码如下:define('WP_USE_THEMES', true);
# 定义是否加载主题文件,true为加载;
require('./wp-blog-header.php');
# 加载wp-blog-header.php文件,该文件用于启动WordPress环境及模板;
第二步:加载wp-blog-header.php文件
该文件有效源码如下:1234567891011 | if ( !isset($wp_did_header) ) {# 判断$wp_did_header变量是否已经设置,如果未设置则执行代码块; $wp_did_header = true; # 见解析1; require_once( dirname(__FILE__) . '/wp-load.php' ); # 见解析2; wp(); # 见解析3; require_once( ABSPATH . WPINC . '/template-loader.php' ); # 见解析4;} |
第三步:加载wp-load.php文件(初始化)
该文件初始化常量(如:定义绝对路径、设定功能文件及内容文件路径等)并加载wp-config.php文件(本处不分析wp-config.php文件不存在的情况),部分核心代码如下:define( 'ABSPATH', dirname(__FILE__) . '/' );# 定义常量ABSPATH为根目录绝对地址;require_once( ABSPATH . 'wp-config.php' );# 加载根目录下wp-config.php文件;从代码看出,本文件的主要作用就是加载wp-config.php文件,故我们可以抽象的将之看作是wp-load.php初始化时的第一个小步骤,具体如下:一、加载wp-config.php文件
该文件主要用于配置MySQL数据库通信信息、设定数据库表名前缀、设定密钥、设置语言及文件绝对路径等,部分核心代码如下(为省事就直接在代码后加#然后解释含义了):define('DB_NAME', 'db_name');# 定义数据库名db_name;define('DB_USER', 'db_username');# 定义数据库用户名db_username;define('DB_PASSWORD', 'db_password');# 定义数据库密码db_password;define('DB_HOST', 'db_host_location');# 定义数据库主机地址,如localhost或其他IP;define('DB_CHARSET', 'utf8');# 定义数据表默认文字编码,如utf8;$table_prefix = 'wp_';# 定义数据库表前缀,一般默认为wp_;define('WPLANG', 'zh_CN');# 定义WordPress语言,中文默认zh_CH,使用的汉化语言文件为/wp-content/languages目录下的zh_CH.mo文件,该文件为二进制,查看具体中文可见zh_CH.po文件;define('WP_DEBUG', false);# 设置开发环境DEBUG,默认为false不开启;require_once(ABSPATH . 'wp-settings.php');# 加载根目录下wp-settings.php文件;代码中定义的数据库常量主要用于数据请求时通信数据库,本文件还有个主要作用就是加载了wp-settings.php文件,而该文件相当于启动WordPress环境的总指挥,下面我们就将该文件作为初始化的第二步来分析。二、加载wp-settings.php文件
该文件主要用于创建和定义常见变量、函数和类的库来为WordPress运行做准备,也就是说WordPress运行过程中使用的大多数变量、函数和类等核心代码都是在这个文件中定义的。这个文件相当于一个总控制器,很多常量定义、函数定义等都是在其他文件中完成,而该文件的作用就是执行那些文件或执行在那些文件中已经定义好的函数。该文件源码分析内容较多,详见“WordPress核心文件wp-setting.php源码分析”。第四步: 执行wp()函数(内容处理)
在这一阶段,调用wp()函数对数据库内容进行查询,并将查询的内容赋值给一些全局变量,方便在模板中使用模板标签获取相应的数据并展示在前端。该函数源码如下:1 2 3 4 5 6 7 8 9 | function wp( $query_vars = '' ) { global $wp, $wp_query, $wp_the_query; # 对变量$wp,$wp_query,$wp_the_query进行全局化; $wp->main( $query_vars ); # 见解析1; if ( !isset($wp_the_query) ) $wp_the_query = $wp_query; # 见解析2; } |
解析2:判断$wp_the_query是否设置,若未设置将其赋值为$wp_query,该对象是query.php文件中WP_Query类实例化得到的,该类作用强大,几乎WP所需要的所有数据信息都是由该类得到的,所以内容的准备工作基本都是这段代码来完成的,该类的具体分析见“”;
至此,WP根据请求准备相应数据的工作也已经完成,下面就需要加载模板并把这些数据展现到前台去了。
第五步:加载template-loader.php文件(主题应用)
该文件根据用户URL返回加载相应模板,其源码如下: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 | if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) do_action('template_redirect'); # 如果常量WP_USE_THEMES存在且值为真,则触发挂载点(动作钩子)template_redirect; if ( is_robots() ) : do_action('do_robots'); return; elseif ( is_feed() ) : do_feed(); return; elseif ( is_trackback() ) : include( ABSPATH . 'wp-trackback.php' ); return; endif; # 判断函数is_robots(), is_feed() 和 is_trackback()的返回结果,处理 feeds 和 trackbacks,即使没有使用任何主题; if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) : $template = false; if ( is_404() && $template = get_404_template() ) : elseif ( is_search() && $template = get_search_template() ) : elseif ( is_tax() && $template = get_taxonomy_template() ) : elseif ( is_front_page() && $template = get_front_page_template() ) : elseif ( is_home() && $template = get_home_template() ) : elseif ( is_attachment() && $template = get_attachment_template() ) : remove_filter('the_content', 'prepend_attachment'); elseif ( is_single() && $template = get_single_template() ) : elseif ( is_page() && $template = get_page_template() ) : elseif ( is_category() && $template = get_category_template() ) : elseif ( is_tag() && $template = get_tag_template() ) : elseif ( is_author() && $template = get_author_template() ) : elseif ( is_date() && $template = get_date_template() ) : elseif ( is_archive() && $template = get_archive_template() ) : elseif ( is_comments_popup() && $template = get_comments_popup_template() ) : elseif ( is_paged() && $template = get_paged_template() ) : else : $template = get_index_template(); endif; # 见解析1; if ( $template = apply_filters( 'template_include', $template ) ) include( $template ); return; endif; # 若template_include过滤钩子上有挂载函数,则对$template进行应用,最终将内容呈现给用户; |
<a href="http://www.ecdoer.com/wp-content/uploads/2013/03/wordpress.png" class="cboxElement" rel="example4" 3429"="" style="color: rgb(105, 105, 105);">
» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!
本文地址: http://www.ecdoer.com/post/wordpress-source-analysis.html
相关文章推荐
- tomcat get 中文乱码
- HDU5726 GCD
- MSReportBuilder 开发学习二
- redis的pconnect解析
- MiniDao_1.6-SNAPSHOT 版本发布,轻量级Java持久化框架
- GroupId和ArtifactId
- 互联网分享知识(一转载 http://www.cnblogs.com/baochuan/p/4636103.html)
- php+ajax注册实时验证功能
- codeforces-57C Array(找规律+逆元)
- mac下 iterm2配色方案
- Cpp环境【Usaco2.1.3】【Vijos1222】顺序排分数
- Search a 2D Matrix II
- Java Calendar 类的时间操作
- [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
- Oracle 找出需要回收高水位的表
- LeetCode 67. Add Binary
- Centos6.X下安装Eclipse
- 【中位数的应用】邮局设置
- 设计模式--装饰器模式
- Task Scheduling