wordpress源码解析-目录结构-文件调用关系(转)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

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

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

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

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

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

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

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

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

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

复制代码
<?php  
/*wp-load.php 
 */  
  
// 定义常量 wordpress根目录的绝对路径   
define( 'ABSPATH', dirname(__FILE__) . '/' );  
//设置错误报告模式 这个if的分支 差别在E_RECOVERABLE_ERROR ?  
if ( defined('E_RECOVERABLE_ERROR') )  
    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);  
else  
    error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);  
//加载wp-config.php  
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*/  
    //如果wp-config.php存在于绝对路径的上一级,而且不是另一个wordpress的一部分  
    require_once( dirname(ABSPATH) . '/wp-config.php' );  
  
} else {  
  
    // wp-config.php 不存在时,  
  
    // Set a path for the link to the installer  
    if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )  
        $path = '';  
    else  
        $path = 'wp-admin/';  
  
    // Die with an error message  
    require_once( ABSPATH . '/wp-includes/class-wp-error.php' );  
    require_once( ABSPATH . '/wp-includes/functions.php' );  
    require_once( ABSPATH . '/wp-includes/plugin.php' );  
    $text_direction = /*WP_I18N_TEXT_DIRECTION*/'从左到右'/*/WP_I18N_TEXT_DIRECTION*/;  
    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));  
}  
?>  
复制代码

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

复制代码
<?php  
/*wp-config.php */  
  
// ** 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');  
复制代码

 

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




本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/p/4740894.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
46
分享
相关文章
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
45 29
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
80 0
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等