文档章节

WordPress 执行过程

LINDXXX
 LINDXXX
发布于 2016/11/11 16:33
字数 1289
阅读 109
收藏 1

我在本地新建的一个WordPress,已经进行过配置,确定可以访问,整个目录结构是这样的

 

WordPress的整个过程


访问一个wordpress 最先应该进入到index.php

define('WP_USE_THEMES', true);
require('./wp-blog-header.php');

第一行定义WP_USR_THEMES常量的值为true

第二行包含并运行文件wp-blog-header.php

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' );
}

检测$wp_did_header是否设置,由于是首次执行,没有设置,进入if语句。定义$wp_did_header变量,然后包含并运行当前目录下的wp-load.php文件。

__FILE__取得当前文件的路径和文件名

dirname()函数取得当前路径

wp-load.php是设置 ABSPATH 常量和加载 wp-config.php 文件的引导文件

wp-config.php 会加载 wp-settings.php 文件。

wp-settings.php 文件 会建立 WordPress 运行环境。

如果 wp-config.php 文件没有找到,会提示一个错误,并让用户去建立一个 wp-config.php 文件。

这个文件也会在 WordPress 目录下搜索 wp-config.php 文件,让 WordPress 的目录保持不变。

wp-load.php 文件代码如下:

// dirname(__FILE__) 即当前路径,将'当前路径/' 定义为 ABSPATH
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 );
// 如果当前目录下 wp-config.php 存在的话
if ( file_exists( ABSPATH . 'wp-config.php') ) {
    require_once( ABSPATH . 'wp-config.php' );
} 
// 如果 wp-config.php 不存在,并且 wp-settings.php 存在
elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
                                                                                                                                                                     
    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') !== false )       $path = 'setup-config.php';
    else
            $path = 'wp-admin/setup-config.php';
    define( 'WPINC', 'wp-includes' );
    define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
    // 将以下文件包含进来,建立 wordpress 安装环境
    require_once( ABSPATH . WPINC . '/load.php' );
    require_once( ABSPATH . WPINC . '/version.php' );
    wp_check_php_mysql_versions();
    wp_load_translations_early();
    require_once( ABSPATH . WPINC . '/functions.php' );
    // 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 &rsaquo; Error' ) );
}

wp-config.php是wordpress的配置文件,包含数据库等一些信息

设置数据信息:

define('DB_NAME', 'wordpress');//数据库名    
define('DB_USER', 'root');//数据库用户名
define('DB_PASSWORD', 'toor');//数据库密码
define('DB_HOST', 'localhost');//数据库主机
define('DB_CHARSET', 'utf8');//数据库字符编码格式

随后是define一些身份密钥,不再解释。设置数据库表前缀和wordpress的语言:

$table_prefix  = 'wp_';
define('WPLANG', 'zh_CN');

后面还有一个确认开发者模式是否开启

  wp-setting.php主要来设置wordpress运行的一些变量和库文件。

require( ABSPATH . WPINC . '/load.php' ); //加载load.php
require( ABSPATH . WPINC . '/default-constants.php' );
require( ABSPATH . WPINC . '/version.php' );

load.php声明了wordpress需要的很多函数,没有什么动作执行。

default-constants.php声明了一些可以被重写的函数。

version.php定义了wordpress需要的组件的版本信息。

然后是调用load.php,default-constants.php中的函数

wp_initial_constants( );//初始化wordpress的一些信息,如内存大小、调试模式和cache情况等
                                                       
wp_check_php_mysql_versions();//检查本地的mysql是否符合要求
                                                         
// Disable magic quotes at runtime. Magic quotes are added using wpdb later in wp-settings.php.禁用魔法引号
@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );
                                                         
// Set default timezone in PHP 5.设置时区
if ( function_exists( 'date_default_timezone_set' ) )
    date_default_timezone_set( 'UTC' );
                                                         
// Turn register_globals off.
wp_unregister_GLOBALS();
                                                         
// Ensure these global variables do not exist so they do not interfere with WordPress.
unset( $wp_filter, $cache_lastcommentmodified );
                                                         
// Standardize $_SERVER variables across setups.
wp_fix_server_vars();
                                                         
// Check if we have received a request due to missing favicon.ico
wp_favicon_request();
                                                         
// Check if we're in maintenance mode.
wp_maintenance();
                                                         
// Start loading timer.
timer_start();
                                                         
// Check if we're in WP_DEBUG mode.
wp_debug_mode();
                                                         
// 加载cache文件
if ( WP_CACHE )
    WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );
                                                         
// 设置语言文件路径
wp_set_lang_dir()

后面又加载了一些php文件:

require( ABSPATH . WPINC . '/compat.php' );//兼容之前的版本,声明一些可能不存在的函数
require( ABSPATH . WPINC . '/functions.php' );//声明了大量的函数,wordpress的函数几乎都在里面
require( ABSPATH . WPINC . '/class-wp.php' );//声明wordpress的类,main就是在这里声明的
require( ABSPATH . WPINC . '/class-wp-error.php' );//声明了错误处理的函数
require( ABSPATH . WPINC . '/plugin.php' );//获取插件信息
require( ABSPATH . WPINC . '/pomo/mo.php' );//mo语言库

class-wp.php文件中声明的主函数:

function main($query_args = '') {
        $this->init();//初始化环境
        $this->parse_request($query_args);//解析请求
        $this->send_headers();
        $this->query_posts();
        $this->handle_404();
        $this->register_globals();
        do_action_ref_array('wp', array(&$this));
    }

    这些函数都是通过wp-blog-header.php中的wp()函数调用。后面wp-setting.php文件又初始化了一些全局变量,初始化了WP对象,并初始化。

$wp = new WP();
$wp->init();

回到wp-load.php文件。这是wp-config.php文件存在的情况。

如果wordpress安装不完全造成该文件不存在,就会进入elseif流程,elseif中首先判断wp-config.php是否存在父目录中,如果父目录不是wordpress的另一个安装版本,就从父目录加载wp-config.php。

最后进入else流程,没有找到wp-config.php文件,因为wp-config.php文件包含了数据库等必不可少的信息,所以程序无法进行下去,就要求用户重新设置wp-config.php文件。

if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== 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_check_php_mysql_versions();
    wp_load_translations_early();
                                                                                                       
    require_once( ABSPATH . WPINC . '/functions.php' );

加载指定的文件来重新生成wp-config.php文件。

wp-load.php完毕,回到wp-blog-header.php文件,调用WP()函数,进而调用wp-class.php中的main函数。

$this->parse_request($query_args);

上面的函数就是个死循环函数,不断地接受浏览器的请求,进行解析。

© 著作权归作者所有

LINDXXX
粉丝 1
博文 16
码字总数 7464
作品 0
唐山
程序员
私信 提问
WordPress 5.1:从CSRF到RCE

译文声明 本文是翻译文章,文章原作者ripstech,文章来源:blog.ripstech.com 原文地址:https://blog.ripstech.com/2019/wordpress-csrf-to-rce/ 译文仅供参考,具体内容表达以及含义原文为...

qdlimit
03/16
0
0
什么是 stack?- 每天5分钟玩转 Docker 容器技术(111)

什么是 stack ? 在回答这个问题之前我们先回忆一下前面部署 WordPress 应用的过程: 首先创建 secret。 然后创建 MySQL service,这是 WordPress 依赖的服务。 最后创建 WordPress service。...

cloudman6
2017/12/26
0
0
WordPress内核中一个任意文件删除漏洞,可导致攻击者执行任意代码

        简介   WordPress是目前网络上最受欢迎的CMS。根据w3tech的资料显示,约有30%的网站都在使用它1。这种广泛的采用,也使其成为了网络犯罪分子非常感兴趣的一个目标。在这篇文...

嘶吼RoarTalk
2018/06/29
0
0
在ECS上基于DOCKER容器急速安装WORDPRESS(3分钟安装)

在学习容器技术的过程中,无意发现docker hub上,已经有了WordPress的官方镜像,已经把WEB环境全部打包好,只需要设置好MySQL数据库既可快速部署个人博客,因此,作为技术达人的我,快速测试...

wuditnt
2018/01/07
0
0
lnmp1.4 环境安装 memcached 和 object-cache.php 过程记录及内存缓存加速效果

大家都知道 wordpress 的弱点在于频繁访问数据库,导致网站打开速度并不理想。使用 Linux 服务器可以添加 memcached 缓存,把常用数据都缓存到内存中,以后访问的时候直接从内存读取数据,提...

taller1980
2018/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
27分钟前
2
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
29分钟前
2
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
37分钟前
4
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
43分钟前
5
0
第八讲:asp.net C# web 读取文件

本讲主要讲解如何在asp.net页面上传文件。 首先,前台页面: 其次,后台页面: 结果: 1、前台效果: 2、后台结果:

刘日辉
54分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部