WordPress 庖丁解牛 第一弹

  

  近突然想研究下传说中的WP,看了网上一些高手写的博客,觉得不错就是比较凌乱,决定加入自己的一些理解整合在一起,也作为自己学习的一个记录。

  版本:WordPress 3.6.1

    开发环境:php version : 5.4.7

       apache : Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7

         System : Windows 7 Ultimate Edition Service Pack 1

WP是单一入口程序:

index.php -> wp-blog-header.php -> wp-load.php -> wp-config.php -> wp-settings.php

                  -> wp()

                  -> template-loader.php

WP调用关系如下图:

WordPress 入口说明


index.php 

入口文件

 1 <?php
 2 /**
 3  * Front to the WordPress application. This file doesn't do anything, but loads
 4  * wp-blog-header.php which does and tells WordPress to load the theme.
 5  *
 6  * @package WordPress
 7  */
 8 
 9 /**
10  * Tells WordPress to load the WordPress theme and output it.
11  *
12  * @var bool
13  */
14 //该常量定义为false时,不使用主题,站点会显示为空白,为true时,则正常显示。
15 define('WP_USE_THEMES', true);
16 
17 /** Loads the WordPress Environment and Template */
18 require('./wp-blog-header.php');

 wp-blog-header.php
ok,let's see ya .

有一个变量 $wp_did_header 它的存在有什么用?  先空着!

 wp-blog-header.php这个文件是加载 WP的环境和模板的

QUOTE:

wordpress可以分为3个阶段:

一是初始化阶段,即初始化常量、环境、加载核心文件等等;

二是内容处理阶段,即根据用户的请求调用相关函数获取和处理数据,为前端展示准备数据;

三是主题应用阶段,在这个阶段,需要展示的数据已经准备完毕,需要根据用户的请求加载相应的主题模板,即对主题进行路由。

经过这三各阶段,用户请求的页面就可以完全的展现出来了。

  • wp-load.php   初始化阶段,加载wp_load.php文件
  • wp()   内容处理阶段   wp()->wp-includes/functions.php
  • template-loader.php   主题应用阶段
 1 <?php
 2 /**
 3  * Loads the WordPress environment and template.
 4  *
 5  * @package WordPress
 6  */
 7 
 8 //wp_did_header变量,相当于一个flag,确保每次刷新时,wp-blog-header.php文件只执行一次。
 9 if ( !isset($wp_did_header) ) {
10 
11     $wp_did_header = true;
12 
13     require_once( dirname(__FILE__) . '/wp-load.php' );
14 
15     wp();
16 
17     require_once( ABSPATH . WPINC . '/template-loader.php' );
18 
19 }

wp_load.php

描述:启动引导(Bootstrap)文件,用于设置ABSPATH常量和加载wp-config.php文件。wp-config.php将会加载wp-settings.php文件,它将用于建立WP的环境。

如果找不到wp-config.php文件,则会提示错误信息,要求用户设置wp-config.php文件。

wp-load.php还会自动搜索WP的上级文件夹寻找wp-config.php文件,因此可以保护WP文件夹不被暴露。
1)设置ABSPATH常量为到WP文件夹的路径。
2)设置错误报告模式。
3)加载wp-config.php文件(a.直接加载、b.从上级文件夹加载、c.找不到则报错,使用wp_die()函数)。
 1 <?php
 2 /**
 3  * Bootstrap file for setting the ABSPATH constant
 4  * and loading the wp-config.php file. The wp-config.php
 5  * file will then load the wp-settings.php file, which
 6  * will then set up the WordPress environment.
 7  *
 8  * If the wp-config.php file is not found then an error
 9  * will be displayed asking the visitor to set up the
10  * wp-config.php file.
11  *
12  * Will also search for wp-config.php in WordPress' parent
13  * directory to allow the WordPress directory to remain
14  * untouched.
15  *
16  * @internal This file must be parsable by PHP4.
17  *
18  * @package WordPress
19  */
20 
21 /** Define ABSPATH as this file's directory */
22 define( 'ABSPATH', dirname(__FILE__) . '/' );
23 
24 
25 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 );
26 
27 if ( file_exists( ABSPATH . 'wp-config.php') ) {
28 
29     /** The config file resides in ABSPATH */
30     require_once( ABSPATH . 'wp-config.php' );
31 
32 } elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
33 
34     /** The config file resides one level above ABSPATH but is not part of another install */
35     //如果wp-config.php存在于绝对路径的上一级,而且不是另一个wordpress的一部分
36     require_once( dirname(ABSPATH) . '/wp-config.php' );
37 
38 } else {
39 
40     // A config file doesn't exist
41 
42     // Set a path for the link to the installer
43     if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )
44         $path = 'setup-config.php';
45     else
46         $path = 'wp-admin/setup-config.php';
47 
48     define( 'WPINC', 'wp-includes' );
49     define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
50     require_once( ABSPATH . WPINC . '/load.php' );
51     require_once( ABSPATH . WPINC . '/version.php' );
52 
53     wp_check_php_mysql_versions();
54     wp_load_translations_early();
55 
56     require_once( ABSPATH . WPINC . '/functions.php' );
57     //2013/10/17  by:richardxu 注意这里的__函数
58     // Die with an error message
59     $die  = __( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
60     $die .= '<p>' . __( "Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>." ) . '</p>';
61     $die .= '<p>' . __( "You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ) . '</p>';
62     $die .= '<p><a href="' . $path . '" class="button button-large">' . __( "Create a Configuration File" ) . '</a>';
63 
64     wp_die( $die, __( 'WordPress &rsaquo; Error' ) );
65 }

wp-config.php

 这个是wp的配置文件

描述:WordPress基础配置文件。
本文件包含以下配置选项: MySQL设置, 数据库表名前缀,密匙, WordPress语言设定以及ABSPATH. 如需更多信息,请访问http://codex.wordpress.org/Editing_wp-config.php. MySQL设置具体信息请咨询您的空间提供商。这个文件用在于安装程序自动生成 wp-config.php 配置文件,你可以手动复制这个文件,并重命名为 wp-config.php,然后输入相关信息。
 
1)设置数据库名、用户名、密码、数据库主机、数据库编码、数据库整理类型、数据库表前缀。
2)设置身份密匙,用于进行cookie加密。
3)设置WP语言。
4)设置WordPress目录的绝对路径ABSPATH。
5)加载wp-settings.php文件。
<?php
/**
 * WordPress基础配置文件。
 *
 * 本文件包含以下配置选项:MySQL设置、数据库表名前缀、密钥、
 * WordPress语言设定以及ABSPATH。如需更多信息,请访问
 * {@link http://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
 * 编辑wp-config.php}Codex页面。MySQL设置具体信息请咨询您的空间提供商。
 *
 * 这个文件被安装程序用于自动生成wp-config.php配置文件,
 * 您可以手动复制这个文件,并重命名为“wp-config.php”,然后填入相关信息。
 *
 * @package WordPress
 */

// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');

/** MySQL数据库用户名 */
define('DB_USER', 'root');

/** MySQL数据库密码 */
define('DB_PASSWORD', 'root');

/** MySQL主机 */
define('DB_HOST', 'localhost');

/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8');

/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');

/**#@+
 * 身份认证密钥与盐。
 *
 * 修改为任意独一无二的字串!
 * 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/
 * WordPress.org密钥生成服务}
 * 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         '[,u,aXAJ^X^$Ab;|{B>CH7.3hz5f]dZR{<Sz_i1QSya)pGiI8.D{)Q*M=ZDybK`E');
define('SECURE_AUTH_KEY',  'kTOj;}3*pd)GK9~$?a!wXUM!kGGuSpirkVO0hhw3M3uYfVfo TWW4A!Ot7Y=t@IM');
define('LOGGED_IN_KEY',    '(`/fid%U%k;0yw|SCV3e1]Y*#4v>A|+Q4#7VJDxsDr9TxH)~sa{L!63)BQ]wPC/F');
define('NONCE_KEY',        'r07u#Pm6=yJ+8e_q5pO6,z-/OiI/wXVV@]5I.]3Jke.!W56[EeufD3p0!zuYipD}');
define('AUTH_SALT',        ' jXvDFsjwmUhk&?OkVqaJ;>}f*/P{RreQkZC3mvnq%KM`DL=p_H~c=mkLso=&SMb');
define('SECURE_AUTH_SALT', '~4L#z$0}zg@#K e~neH5Z`UeGqI|0H2>@uq8lg2G[I7g}h!ii8YQCmvw[`x)D[_c');
define('LOGGED_IN_SALT',   '[f#FWrv;BjfZy1!vS[>wd1@}Z-t35{/mbv>sdRIv14&w7i=|!):}X+MoNC6-87np');
define('NONCE_SALT',       'OXLMjbQ=/%qz.tz&7_q{0*^1.,AhOob9j7C%39n`nz`#g+-_cK~P@0lU/?q,Z4M6');

/**#@-*/

/**
 * WordPress数据表前缀。
 *
 * 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
 * 不同的数据表前缀。前缀名只能为数字、字母加下划线。
 */
$table_prefix  = 'wp_';

/**
 * WordPress语言设置,中文版本默认为中文。
 *
 * 本项设定能够让WordPress显示您需要的语言。
 * wp-content/languages内应放置同名的.mo语言文件。
 * 例如,要使用WordPress简体中文界面,请在wp-content/languages
 * 放入zh_CN.mo,并将WPLANG设为'zh_CN'。
 */
define('WPLANG', 'zh_CN');

/**
 * 开发者专用:WordPress调试模式。
 *
 * 将这个值改为true,WordPress将显示所有用于开发的提示。
 * 强烈建议插件开发者在开发环境中启用WP_DEBUG。
 */
//2013/10/17 by:richardxu 开启
//define('WP_DEBUG', false);
define('WP_DEBUG', true);

/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */

/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');

OK,接下来是

wp-settings.php

这部分放到第二弹中说明,lol~

 参考:

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

http://www.cnblogs.com/vicenteforever/articles/1866155.html

原文地址:https://www.cnblogs.com/RichardXu/p/3376260.html