学习开源代码,是一种很快的提升自己的学习方法。Wordpress作为一个开源的博客系统,非常优秀,应用广泛,使用起来简单方便,具有丰富的主题和插件,可以按照自己的需求来任意的进行修改。所以就从wordpress的源码开始自己的php学习之路,希望自己能坚持下去!

Wordpress版本:3.1.2

平台:新浪sae平台。monk.sinaapp.com

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. $wp_did_header = true;//置为true,确保只执行一次。
  6. //初始化阶段。加载wp-load.php,
  7. require_once( dirname(__FILE__) . '/wp-load.php' );
  8. //内容处理阶段 wp()位于functon.php中
  9. wp();
  10. //主题应用阶段。ABSPATH wordpress目录的绝对路径
  11. require_once( ABSPATH . WPINC . '/template-loader.php' );
  12. }

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

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

  1. <?php
  2. /*wp-load.php
  3. */
  4. // 定义常量 wordpress根目录的绝对路径
  5. define( 'ABSPATH', dirname(__FILE__) . '/' );
  6. //设置错误报告模式 这个if的分支 差别在E_RECOVERABLE_ERROR ?
  7. if ( defined('E_RECOVERABLE_ERROR') )
  8. 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);
  9. else
  10. error_reporting(E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING);
  11. //加载wp-config.php
  12. if ( file_exists( ABSPATH . 'wp-config.php') ) {
  13. /** The config file resides in ABSPATH */
  14. require_once( ABSPATH . 'wp-config.php' );
  15. } elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
  16. /** The config file resides one level above ABSPATH but is not part of another install*/
  17. //如果wp-config.php存在于绝对路径的上一级,而且不是另一个wordpress的一部分
  18. require_once( dirname(ABSPATH) . '/wp-config.php' );
  19. } else {
  20. // wp-config.php 不存在时,
  21. // Set a path for the link to the installer
  22. if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )
  23. $path = '';
  24. else
  25. $path = 'wp-admin/';
  26. // Die with an error message
  27. require_once( ABSPATH . '/wp-includes/class-wp-error.php' );
  28. require_once( ABSPATH . '/wp-includes/functions.php' );
  29. require_once( ABSPATH . '/wp-includes/plugin.php' );
  30. $text_direction = /*WP_I18N_TEXT_DIRECTION*/'从左到右'/*/WP_I18N_TEXT_DIRECTION*/;
  31. 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));
  32. }
  33. ?>

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

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

wordpress源码解析-目录结构-文件调用关系(1)的更多相关文章

  1. 黄聪:wordpress源码解析-目录结构-文件调用关系(转)

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

  2. android源码的目录结构

    android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic              ...

  3. jdk源码剖析一:OpenJDK-Hotspot源码包目录结构

    开启正文之前,先说一下源码剖析这一系列,就以“死磕到底”的精神贯彻始终,JDK-->JRE-->JVM(以openJDK代替) 最近想看看JDK8源码,但JDK中JVM(安装在本地C:\P ...

  4. 第零章 dubbo源码解析目录

    第一章 第一个dubbo项目 第二章  dubbo内核之spi源码解析 2.1  jdk-spi的实现原理 2.2 dubbo-spi源码解析 第三章 dubbo内核之ioc源码解析 第四章 dubb ...

  5. Flink 源码解析 —— 项目结构一览

    Flink 源码项目结构一览 https://t.zsxq.com/MNfAYne 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  6. Vue 源码分析—— 目录结构

    一,Vue.js 的源码都是在src 目录下,其目录结构如下. 1.compiler 目录包含Vue.js 所有编译相关的代码.它包括把所有模板解析成ast 语法树, ast 语法树优化等功能. 2. ...

  7. vue源码解读-目录结构

    目录结构 ├── scripts ------------------------------- 构建相关的文件,一般情况下我们不需要动│ ├── git-hooks ---------------- ...

  8. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  9. Vue源码之目录结构

    Vue版本:2.6.9 源码结构图 ├─ .circleci // 包含CircleCI持续集成/持续部署工具的配置文件 ├─ .github // 项目相关的说明文档,上面的说明文档就在此文件夹 ├ ...

随机推荐

  1. No handlers could be found for logger "keystoneauth.identity.generic.base"

    一般是因为发现了多个keystone的url造成的.

  2. Intellij Idea 14 生成serialVersionUID的方法

    默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需 ...

  3. Java for LeetCode 223 Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  4. SAP SMARTFORMS-基于内存方式在report程序中传递数据到smartforms显示

    一.准备工作 1.新建include程序 1> include程序名字:ZDD_INC_0104 2> ZDD_INC_0104  程序中的内容为 2.使用T-CODE :SE11新建两个 ...

  5. Mathematics:Find a multiple(POJ 2356)

    找组合 题目大意:给你N个自然数,请你求出若干个数的组合的和为N的整数倍的数 经典鸽巢原理题目,鸽巢原理的意思是,有N个物品,放在N-1个集合中,则一定存在一个集合有2个元素或以上. 这一题是说有找出 ...

  6. H5 前端页面适配响应式

    辞职有半个月了,面试了几家公司,还在挣扎中.... 不废话,H5页面适配成响应式,可以用百分比或者rem. rem是相对于html根元素的单位,可以根据根元素的大小做出等比缩放, 通常,假如设置,ht ...

  7. Gson解析复杂的json数据

    最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的json解析方法即JsonObject ...

  8. centos 6.5 配置LDAP服务器+客户端!

    各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言...开始吧 Note: 本次配置的服务器环境是<redhat enterprise ...

  9. .net如何实现时间相减得到天数

    第一种方法: 为了得到时间的天数,代码如下:(计算整天,不含半天) DateTime start = DateTime.Parse(txt_start.Value.Trim());//开始时间 Dat ...

  10. Single Number II

    题目: Given an array of integers, every element appears three times except for one. Find that single o ...