WordPress 源码学习
[ ]The content is recoverd from Wordpress Blog, for more details please check HERE
August 31, 2014
接着 #00 来继续写 ,我们上一期看到wp-blog-header那个文件 ,里面包含了wp-load 和 template-loader.php 我们按照顺序先来看
首先我们先自己测试一下 include 和 require的区别 根据这段实例代码
<?php
echo "<h1>"."INCLUDE 1"."</h1>";
require('./include1.txt');
echo INC;
echo "<h1>"."INCLUDE 2"."</h1>";
include('./include2.php');
echo INC
?>
其中 ,INC是在include2.php内定义的常量, 有人说 inlcude和require的一个区别是 include会把文件包含在整个代码的最前面 ,而require不会 ,按照他的说法 ,这个代码运行的时候运行到底一个echo INC 就应该输出了 INC的值 可实际上 运行结果是未定义的常量 ,所以 ,这个说法是错误的 include 和require 都是在运行到这里的时候,才会把文件包括进去,而不是在一开始就包括进去 。 下面测试一下 ,如果require的文件不存在会怎样
把sample.php的第一个require的文件名改为 mengmengda.php(这个文件真的不存在哦~) 我们得到了这样的错误报告
Fatal error: require() [function.require]: Failed opening required ‘./mengmengda.php’ (include_path=’.;C:php5pear’) in F:WAMPwwwwplearnindex.php on line 4
果然是个FatalError 我们再试试把include的改为 mengmengda.php
index.php文件正常显示,除了报了两个警告以外,没有其它的问题 ,看来这就是include和require的区别了 ~
下面我们继续研究wp-blog-header.php里面require的那几个 ,首先深入研究wp-load.php
这段注释里面已经说明了,这个代码做了什么 来看一下注释:
/**
* Bootstrap file for setting the ABSPATH constant
* and loading the wp-config.php file. The wp-config.php
* file will then load the wp-settings.php file, which
* will then set up the WordPress environment.
*
* If the wp-config.php file is not found then an error
* will be displayed asking the visitor to set up the
* wp-config.php file.
*
* Will also search for wp-config.php in WordPress' parent
* directory to allow the WordPress directory to remain
* untouched.
*
* @internal This file must be parsable by PHP4.
*
* @package WordPress
*/
也就是说 ,wp-load是一个引导程序(bootstrap),这个引导程序定义了ABSPATH绝对路径 这个常量 然后 会加载wp-config并且由wp-config来加载wp-settings这个文件,如果不存在wp-config那么就会要求用户创建wp-config.php 这个bootstrap也会在WP的父母目录下搜索wp-config这个文件,保证WP的目录不被触碰(逗号后面这句话没明白) 在内部这段代码必须以php4编译
下面是 wp-load的代码
<?php
/**
* Bootstrap file for setting the ABSPATH constant
* and loading the wp-config.php file. The wp-config.php
* file will then load the wp-settings.php file, which
* will then set up the WordPress environment.
*
* If the wp-config.php file is not found then an error
* will be displayed asking the visitor to set up the
* wp-config.php file.
*
* Will also search for wp-config.php in WordPress' parent
* directory to allow the WordPress directory to remain
* untouched.
*
* @internal This file must be parsable by PHP4.
*
* @package WordPress
*/
/** Define ABSPATH as this file's directory */
define( 'ABSPATH', dirname(\_\_FILE\_\_) . '/' );
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 );
if ( file\_exists( ABSPATH . 'wp-config.php') ) {
/** The config file resides in ABSPATH */
require\_once( ABSPATH . 'wp-config.php' );
} elseif ( file\_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file\_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
/** The config file resides one level above ABSPATH but is not part of another install */
require\_once( dirname(ABSPATH) . '/wp-config.php' );
} else {
// A config file doesn't exist
// Set a path for the link to the installer
if ( strpos($\_SERVER['PHP\_SELF'], 'wp-admin') !The content is recoverd from Wordpress Blog, for more details please check [HERE](recover-my-blog) false )
$path = 'setup-config.php';
else
$path = 'wp-admin/setup-config.php';
define( 'WPINC', 'wp-includes' );
define( 'WP\_CONTENT\_DIR', ABSPATH . 'wp-content' );
require\_once( ABSPATH . WPINC . '/load.php' );
require\_once( ABSPATH . WPINC . '/version.php' );
wp\_load\_translations\_early();
wp\_check\_php\_mysql\_versions();
// Die with an error message
$die = \_\_( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
$die .= '<p>' . \_\_( "Need more help? <a href='http://codex.wordpress.org/Editing\_wp-config.php'>We got it</a>." ) . '</p>';
$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>';
$die .= '<p><a href="' . $path . '" class="button">' . \_\_( "Create a Configuration File" ) . '</a>';
wp\_die( $die, \_\_( 'WordPress › Error' ) );
}
error_reporting这个函数 就是设置报错级别的一个函数 , 用法就是 error_reporting(CONSTANT1 | CONST 2 | …) 设置了之后 系统会把你指定的类型的错误报告,其他的不报告 ,举个例子 ,如果是 error_report(0)那么 就不会报告几乎任何错误 ,上面那个sample.php的代码 会输出一行 INCLUDE1 然后由于编译错误 ,不能继续运行了, 但是由于你的报错级别设定,不会显示错误信息 。 而如果你把常量定为-1 即error_report(-1)那么PHP会报告所有已知的错误和警告 |
下面这段代码就是检查 wp-config.php是否存在了~
首先 ,如果这个文件(wp-config)存在于当前的目录下,那么就加载它 如果这个文件存在于WP的父母目录, 并且在当前目录的父母目录不存在wp-settings 这一文件,加载wp-config(没看明白)如果都不是 就说明wp config还没被配置,这时候就会要求配置wp-config也就是下面的代码 我们来看一下else时候执行的代码 首先 ,获得$_SERVER数组里的$index为 PHP_SELF的变量值,这个值经测试为 /index.php,暂时猜测这个变量的值是目前你所在的网页的路径名 and 文件名 这里还需要再查阅资料 ,下面 我们先跳过wp_load_translations_early 以及下面的1个函数,因为这些函数都在**functions.php文件下 ,我们先来看 ,如果存在wp-config这个文件,会如何执行下面的代码 :
下面是 wp-config的代码 :
<?php
/**
* WordPress 基础配置文件。
*
* 本文件包含以下配置选项: MySQL 设置、数据库表名前缀、
* 密匙、WordPress 语言设定以及 ABSPATH。如需更多信息,请访问
* {@link http://codex.wordpress.org/Editing\_wp-config.php 编辑
* wp-config.php} Codex 页面。MySQL 设置具体信息请咨询您的空间提供商。
*
* 这个文件用在于安装程序自动生成 wp-config.php 配置文件,
* 您可以手动复制这个文件,并重命名为 wp-config.php,然后输入相关信息。
*
* @Author Elmer Zhang <[[email protected]](/web/20201204195450/https://void-shana.moe/cdn-cgi/l/email-protection)>
* @package WordPress
*/
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress 数据库的名称 */
define('DB\_NAME', SAE\_MYSQL\_DB);
/** MySQL 数据库用户名 */
define('DB\_USER', SAE\_MYSQL\_USER);
/** MySQL 数据库密码 */
define('DB\_PASSWORD', SAE\_MYSQL\_PASS);
/** MySQL 主机 */
define('DB\_HOST', SAE\_MYSQL\_HOST\_M.':'.SAE\_MYSQL\_PORT);
/** 创建数据表时默认的文字编码 */
define('DB\_CHARSET', 'utf8');
/** 数据库整理类型。如不确定请勿更改 */
define('DB\_COLLATE', '');
define('WP\_USE\_MULTIPLE\_DB', true);
$db\_list = array(
'write'=> array(
array(
'db\_host' => SAE\_MYSQL\_HOST\_M.':'.SAE\_MYSQL\_PORT,
'db\_user'=> SAE\_MYSQL\_USER,
'db\_password'=> SAE\_MYSQL\_PASS,
'db\_name'=> SAE\_MYSQL\_DB,
'db\_charset'=> 'utf8'
)
),
'read'=> array(
array(
'db\_host' => SAE\_MYSQL\_HOST\_S.':'.SAE\_MYSQL\_PORT,
'db\_user'=> SAE\_MYSQL\_USER,
'db\_password'=> SAE\_MYSQL\_PASS,
'db\_name'=> SAE\_MYSQL\_DB,
'db\_charset'=> 'utf8'
)
),
);
$global\_db\_list = $db\_list['write'];
/**#@+
* 身份密匙设定。
*
* 您可以随意写一些字符
* 或者直接访问 {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org 私钥生成服务},
* 任何修改都会导致 cookie 失效,所有用户必须重新登录。
*
* @since 2.6.0
*/
define('AUTH\_KEY', hash\_hmac('sha1', SAE\_ACCESSKEY . 'AUTH\_KEY', SAE\_SECRETKEY ));
define('SECURE\_AUTH\_KEY', hash\_hmac('sha1', SAE\_ACCESSKEY . 'SECURE\_AUTH\_KEY', SAE\_SECRETKEY ));
define('LOGGED\_IN\_KEY', hash\_hmac('sha1', SAE\_ACCESSKEY . 'LOGGED\_IN\_KEY', SAE\_SECRETKEY ));
define('NONCE\_KEY', hash\_hmac('sha1', SAE\_ACCESSKEY . 'NONCE\_KEY', SAE\_SECRETKEY ));
define('AUTH\_SALT', hash\_hmac('sha1', SAE\_ACCESSKEY . 'AUTH\_SALT', SAE\_SECRETKEY ));
define('SECURE\_AUTH\_SALT', hash\_hmac('sha1', SAE\_ACCESSKEY . 'SECURE\_AUTH\_SALT', SAE\_SECRETKEY ));
define('LOGGED\_IN\_SALT', hash\_hmac('sha1', SAE\_ACCESSKEY . 'LOGGED\_IN\_SALT', SAE\_SECRETKEY ));
define('NONCE\_SALT', hash\_hmac('sha1', SAE\_ACCESSKEY . 'NONCE\_SALT', SAE\_SECRETKEY ));
/**#@-*/
/**
* WordPress 数据表前缀。
*
* 如果您有在同一数据库内安装多个 WordPress 的需求,请为每个 WordPress 设置不同的数据表前缀。
* 前缀名只能为数字、字母加下划线。
*/
$table\_prefix = 'wp\_';
/**
* WordPress 语言设置,默认为英语。
*
* 本项设定能够让 WordPress 显示您需要的语言。
* wp-content/languages 内应放置同名的 .mo 语言文件。
* 要使用 WordPress 简体中文界面,只需填入 zh\_CN。
*/
define ('WPLANG', 'zh\_CN');
/**
* 开发者专用:WordPress 调试模式。
*
* 将这个值改为“true”,WordPress 将显示所有开发过程中的提示。
* 强烈建议插件开发者在开发环境中启用本功能。
*/
define('WP\_DEBUG', false);
/* 好了!请不要再继续编辑。请保存该文件。 */
/** WordPress 目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(\_\_FILE\_\_) . '/');
/** 设置 WordPress 变量和包含文件。 */
require\_once(ABSPATH . 'wp-settings.php');
这个代码没什么太多需要说明的 ,它实际上就是做了很多定义的工作 ,定义了很多常量,然后在最后包含了 wp-settings.php这个文件 这个文件才是重头戏~
wp-settings.php这个文件需要很长时间来研究 ,这次就先到这里~下次开始研究wp-settings.php
PHP, Web Develop C. Linux, kernel, Laravel, PHP, Python, Shell, Web, wine
Historical Comments
Post navigation ————— NEXT
WordPress 源码学习 #02 PREVIOUS WordPress 源码学习 #00