前端页面请求

对WordPress站点可以发起两种类型的请求:前端请求和管理后台请求。让我们更深入地了解典型WordPress前端请求所运行的代码。

什么是前端请求?

除了特定请求(比如我们在文件结构课程中看到的那些)之外,任何对WordPress站点内容(也称为WordPress前端)的请求都由根目录中的index.php文件处理。

在这里,设置了WP_USE_THEMES常量,然后引入了第一个附加文件wp-blog-header.php

关于require、require_once、include、include_once的说明

require是一个特殊的PHP语句,它会包含被引入文件的内容。PHP中有一个类似的语句叫include,功能相同。区别在于,如果文件无法被引入,使用require会抛出错误并终止执行。

还有补充语句,即require_once(或include_once),它们仅在文件尚未被引入时才会包含该文件。

wp-blog-header.php

wp-blog-header.php文件通过引入wp-load.php文件来设置WordPress环境。

wp-load.php

在这里定义了ABSPATH常量,大多数插件用它来检查插件是否确实在WordPress环境中运行。

然后,该文件设置了一些错误报告级别。

之后,它查找并加载wp-config.php文件,或者尝试重定向到/wp-admin/setup-config.php,以通知用户创建wp-config.php文件。

你还会注意到,这段代码允许将wp-config.php文件移动到WordPress目录之外,这是一种常见的安全最佳实践。通过将wp-config.php文件移出WordPress目录,可以防止恶意用户访问该文件。

wp-config.php

该文件定义了数据库常量、调试常量以及WordPress安装可能需要的其他常量。

然后,它引入了wp-settings.php文件,该文件用于设置WordPress环境。

wp-settings.php

wp-settings.php是设置WordPress环境的文件。它做了很多工作,因此这里将对其设置的所有内容进行一个高级摘要。

  1. 设置版本信息
  2. 引入初始化所需的任何文件
  3. 设置大多数默认常量
  4. 注册一个致命错误处理器,以防出现任何问题
  5. 设置各种服务器变量,检查维护模式并检查调试模式
  6. 引入WordPress核心功能所需的核心WordPress文件
  7. 设置数据库层和全局数据库变量
  8. 初始化多站点
  9. 定义SHORTINIT常量,可用于自定义请求
  10. 加载其余WordPress文件
  11. 加载必须使用的插件
  12. 加载网络激活的插件(如果是多站点)
  13. 设置Cookie或SSL所需的任何常量
  14. 创建任何公共变量
  15. 创建核心分类法和文章类型
  16. 注册主题目录根路径
  17. 加载激活的插件
  18. 加载可插入函数(已不再使用)
  19. 为任何请求变量添加魔术引号
  20. 创建全局WP_Query对象WP_Rewrite对象、WP对象、WP_Widget_Factory对象、WP_Roles对象
  21. 设置区域设置功能(多语言支持和本地化/翻译)
  22. 加载激活主题的functions.php文件
  23. 为定时任务创建WP_Site_Health实例

wp()函数

回到wp-blog-header.php文件,一旦WordPress环境设置完成,就会调用wp()函数。该函数确定需要渲染的内容,并从数据库中获取相关数据。

wp()函数调用$wp对象的main方法,该对象位于wp-includes/class-wp.php文件中。

该方法调用init()方法。

该方法调用wp_get_current_user()函数,该函数设置当前用户对象。

然后,它调用parse_request()方法。

该方法解析请求,并根据请求设置查询变量。

这个方法做了很多工作,但简而言之,它将请求与重写规则进行匹配,并根据匹配的规则创建$query_vars数组。如果没有匹配的重写规则,它将尝试基于查询字符串填充$query_vars数组。

回到 main 方法,如果 parse_request() 返回 true,它将调用 query_posts()handle_404()register_globals() 方法。

query_posts() 调用 build_query_string() 方法,该方法根据查询变量构建查询字符串。

然后它调用 $wp_the_query 对象的 query() 方法。这段代码位于 wp-includes/class-wp-query.php 文件中的 WP_Query 类中。这将执行查询并用结果填充 WP_Query 对象。

一旦它初始化查询并解析参数,就会运行 get_posts() 方法,该方法根据传入的查询参数/永久链接创建 SQL 查询,然后针对数据库运行查询以返回相关数据。

handle_404() 用于设置 404 的标头,如果请求的 URL 没有找到任何内容。

最后,register_globals() 将查询变量注册为全局变量。

完成这些之后,会调用 send_headers() 方法,该方法将任何相关的标头发送到浏览器。

最后但同样重要的是,它会运行已添加到 wp 动作钩子中的所有回调函数。你将在后续课程中了解钩子。

template-loader.php

回到 wp-blog-header.php,在所有查询数据设置完成后,会加载模板加载器。它会根据访问者的 URL 查找并加载正确的模板。

  1. template_redirect 动作 – 在加载模板之前触发。
  2. is_robots() – 检查请求是否针对 robots.txt 文件。
  3. is_favicon() – 检查请求是否针对 favicon.ico 文件。
  4. is_feed() – 检查请求是否针对 RSS 订阅源。
  5. is_trackback() – 检查请求是否针对 trackback。
  6. 如果 wp_using_themes
    1. 遍历每个模板条件,并找到相应的模板文件。
  7. template_include 过滤器 – 在包含当前模板之前过滤其路径。
  8. 包含模板文件 – 注意使用的是 include 而不是 require,这样即使模板文件缺失,页面的其余部分仍然可以渲染。