Wordpress源码分析 目录结构-文件调用关系(1)

  (因为分析源码也会看别人的分析,看到好的我会粘贴过来,当然会带上链接^_^。)

  Wordpress是一个单入口的文件,所有的前端处理都必须经过index.php,这是通过修改web服务器的rewrite规则来实现的。这种做法的好处是显而易见的,这样URL更好看,不必为每一个url新建一个文件。

  我们看看wp大致的文件调用是什么样子的。

        

  wordpress可以分为3个阶段,一是初始化阶段,即初始化常量、环境、加载核心文件等等;二是内容处理阶段,即根据用户的请求调用相关函数获取和处理数据,为前端展示准备数据;三是主题应用阶段,在这个阶段,需要展示的数据已经准备完毕,需要根据用户的请求加载相应的主题模板,即对主题进行路由。经过这三各阶段,用户请求的页面就可以完全的展现出来了。从上图可以看到wp的初始化阶段相当的繁琐。

  Index.php文件实际上没啥内容. 定义了常量WP_USE_THEMES和加载了文件wp-blog-header.php

1 <?php
2 /*index.php*/
3 //该常量定义为false时,不使用主题,站点会显示为空白,为true时,则正常显示。
4 define('WP_USE_THEMES', true);
5 //加载wp-blog-header.php
6 require('./wp-blog-header.php');
7 ?>

  wp--blog-header里面是什么样子呢?

 1 <?php
 2 /*wp-blog-header.php */
 3 //wp_did_header变量,相当于一个flag,确保每次刷新时,wp-blog-header.php文件只执行一次。
 4 if ( !isset($wp_did_header) ) {
 5 
 6     $wp_did_header = true;//置为true,确保只执行一次。
 7     //初始化阶段。加载wp-load.php,
 8     require_once( dirname(__FILE__) . '/wp-load.php' );
 9     //内容处理阶段 wp()位于functon.php中
10     wp();
11     //主题应用阶段。ABSPATH wordpress目录的绝对路径
12     require_once( ABSPATH . WPINC . '/template-loader.php' );
13 
14 }

 

      wp-blog-header仍然很简单,但是可以看到wp的三个明显的阶段,初始化阶段、内容处理阶段、主题应用阶段。

     wp-load.php的功能很简单,就是加载wp-config.php. wp-config.php是需要用户自己进行设置的。设置DB设置,密钥,路径,语言

 1 <?php
 2 /*wp-load.php
 3  */
 4 
 5 // 定义常量 wordpress根目录的绝对路径 
 6 define( 'ABSPATH', dirname(__FILE__) . '/' );
 7 //设置错误报告模式 这个if的分支 差别在E_RECOVERABLE_ERROR ?
 8 if ( defined('E_RECOVERABLE_ERROR') )
 9     error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR);
10 else
11     error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);
12 //加载wp-config.php
13 if ( file_exists( ABSPATH . 'wp-config.php') ) {
14 
15     /** The config file resides in ABSPATH */
16     require_once( ABSPATH . 'wp-config.php' );
17 
18 } elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
19 
20     /** The config file resides one level above ABSPATH but is not part of another install*/
21     //如果wp-config.php存在于绝对路径的上一级,而且不是另一个wordpress的一部分
22     require_once( dirname(ABSPATH) . '/wp-config.php' );
23 
24 } else {
25 
26     // wp-config.php 不存在时,
27 
28     // Set a path for the link to the installer
29     if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )
30         $path = '';
31     else
32         $path = 'wp-admin/';
33 
34     // Die with an error message
35     require_once( ABSPATH . '/wp-includes/class-wp-error.php' );
36     require_once( ABSPATH . '/wp-includes/functions.php' );
37     require_once( ABSPATH . '/wp-includes/plugin.php' );
38     $text_direction = /*WP_I18N_TEXT_DIRECTION*/'从左到右'/*/WP_I18N_TEXT_DIRECTION*/;
39     wp_die(sprintf(/*WP_I18N_NO_CONFIG*/'看起来似乎没有 <code>wp-config.php</code> 文件。我们需要这个文件来让一切开始,可以查看<a href=\'http://codex.wordpress.org/Editing_wp-config.php\'>更多帮助</a>。 那么现在您可以通过这个 Web 界面创建一个 <code>wp-config.php</code> 文件,但并非所有主机都支持,安全的做法是手动创建。</p><p><a href=\'%ssetup-config.php\' class=\'button\'>试试创建一个配置文件</a>'/*/WP_I18N_NO_CONFIG*/, $path), /*WP_I18N_ERROR_TITLE*/'WordPress › 错误'/*/WP_I18N_ERROR_TITLE*/, array('text_direction' => $text_direction));
40 }
41 ?>

  来看看wp-config.php是什么样子的。

 1  <?php
 2 /*wp-config.php */
 3 
 4 // ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
 5 /** WordPress 数据库的名称 */
 6 define('DB_NAME', SAE_MYSQL_DB);
 7 
 8 /** MySQL 数据库用户名 */
 9 define('DB_USER', SAE_MYSQL_USER);
10 
11 /** MySQL 数据库密码 */
12 define('DB_PASSWORD', SAE_MYSQL_PASS);
13 
14 /** MySQL 主机 */
15 define('DB_HOST', SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT);
16 
17 /** 创建数据表时默认的文字编码 */
18 define('DB_CHARSET', 'utf8');
19 
20 /** 数据库整理类型。如不确定请勿更改 */
21 define('DB_COLLATE', '');
22 
23 define('WP_USE_MULTIPLE_DB', true);
24 
25 $db_list = array(
26         'write'=> array(
27             array(
28                 'db_host' => SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,
29                 'db_user'=> SAE_MYSQL_USER,
30                 'db_password'=> SAE_MYSQL_PASS,
31                 'db_name'=> SAE_MYSQL_DB,
32                 'db_charset'=> 'utf8'
33                 )
34             ),
35         'read'=> array(
36             array(
37                 'db_host' => SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT,
38                 'db_user'=> SAE_MYSQL_USER,
39                 'db_password'=> SAE_MYSQL_PASS,
40                 'db_name'=> SAE_MYSQL_DB,
41                 'db_charset'=> 'utf8'
42                 )
43             ),
44         );
45 $global_db_list = $db_list['write'];
46 
47 /**#@+
48  * 身份密匙设定。
49  *
50  * 您可以随意写一些字符
51  * 或者直接访问 {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org 私钥生成服务},
52  * 任何修改都会导致 cookie 失效,所有用户必须重新登录。
53  *
54  * @since 2.6.0
55  */
56 define('AUTH_KEY',         hash_hmac('sha1', SAE_ACCESSKEY . 'AUTH_KEY', SAE_SECRETKEY ));
57 define('SECURE_AUTH_KEY',  hash_hmac('sha1', SAE_ACCESSKEY . 'SECURE_AUTH_KEY', SAE_SECRETKEY ));
58 define('LOGGED_IN_KEY',    hash_hmac('sha1', SAE_ACCESSKEY . 'LOGGED_IN_KEY', SAE_SECRETKEY ));
59 define('NONCE_KEY',        hash_hmac('sha1', SAE_ACCESSKEY . 'NONCE_KEY', SAE_SECRETKEY ));
60 define('AUTH_SALT',        hash_hmac('sha1', SAE_ACCESSKEY . 'AUTH_SALT', SAE_SECRETKEY ));
61 define('SECURE_AUTH_SALT', hash_hmac('sha1', SAE_ACCESSKEY . 'SECURE_AUTH_SALT', SAE_SECRETKEY ));
62 define('LOGGED_IN_SALT',   hash_hmac('sha1', SAE_ACCESSKEY . 'LOGGED_IN_SALT', SAE_SECRETKEY ));
63 define('NONCE_SALT',       hash_hmac('sha1', SAE_ACCESSKEY . 'NONCE_SALT', SAE_SECRETKEY ));
64 
65 /**#@-*/
66 
67 /**
68  * WordPress 数据表前缀。
69  *
70  * 如果您有在同一数据库内安装多个 WordPress 的需求,请为每个 WordPress 设置不同的数据表前缀。
71  * 前缀名只能为数字、字母加下划线。
72  */
73 $table_prefix  = 'wp_';
74 
75 /**
76  * WordPress 语言设置,默认为英语。
77  *
78  * 本项设定能够让 WordPress 显示您需要的语言。
79  * wp-content/languages 内应放置同名的 .mo 语言文件。
80  * 要使用 WordPress 简体中文界面,只需填入 zh_CN。
81  */
82 define ('WPLANG', 'zh_CN');
83 
84 /**
85  * 开发者专用:WordPress 调试模式。
86  *
87  * 将这个值改为“true”,WordPress 将显示所有开发过程中的提示。
88  * 强烈建议插件开发者在开发环境中启用本功能。
89  */
90 define('WP_DEBUG', false);
91 
92 /* 好了!请不要再继续编辑。请保存该文件。 */
93 
94 /** WordPress 目录的绝对路径。 */
95 if ( !defined('ABSPATH') )
96     define('ABSPATH', dirname(__FILE__) . '/');
97 
98 /** 设置 WordPress 变量和包含文件。 这个文件内容很多啊,分析较困难*/
99 require_once(ABSPATH . 'wp-settings.php');

 

  参考:http://blog.csdn.net/liujiyong7/article/details/8037843

posted @ 2013-09-02 11:51  骑猪南下  阅读(1336)  评论(0编辑  收藏  举报