对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环境的文件。它做了很多工作,因此这里将对其设置的所有内容进行一个高级摘要。
- 设置版本信息
- 引入初始化所需的任何文件
- 设置大多数默认常量
- 注册一个致命错误处理器,以防出现任何问题
- 设置各种服务器变量,检查维护模式并检查调试模式
- 引入WordPress核心功能所需的核心WordPress文件
- 设置数据库层和全局数据库变量
- 初始化多站点
- 定义
SHORTINIT常量,可用于自定义请求 - 加载其余WordPress文件
- 加载必须使用的插件
- 加载网络激活的插件(如果是多站点)
- 设置Cookie或SSL所需的任何常量
- 创建任何公共变量
- 创建核心分类法和文章类型
- 注册主题目录根路径
- 加载激活的插件
- 加载可插入函数(已不再使用)
- 为任何请求变量添加魔术引号
- 创建全局
WP_Query对象、WP_Rewrite对象、WP对象、WP_Widget_Factory对象、WP_Roles对象 - 设置区域设置功能(多语言支持和本地化/翻译)
- 加载激活主题的functions.php文件
- 为定时任务创建
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 查找并加载正确的模板。
template_redirect动作 – 在加载模板之前触发。is_robots()– 检查请求是否针对 robots.txt 文件。is_favicon()– 检查请求是否针对 favicon.ico 文件。is_feed()– 检查请求是否针对 RSS 订阅源。is_trackback()– 检查请求是否针对 trackback。- 如果
wp_using_themes- 遍历每个模板条件,并找到相应的模板文件。
template_include过滤器 – 在包含当前模板之前过滤其路径。- 包含模板文件 – 注意使用的是
include而不是require,这样即使模板文件缺失,页面的其余部分仍然可以渲染。