WordPress插件开发教程:插件的加载顺序,执行过程

如何创建自己的Wordpress插件呢?在创建之前,我们需要了解Wordpress的插件运行机制和执行过程,以下是Wordpress自定义插件的加载顺序和执行过程:

1.首先执行网站根目录下的第一个文件:index.php
首先加载的是根文件夹中的index.php。该文件本身并没有太多作用。 它定义一个常量并在同一文件夹中加载文件 wp-blog-header.php ,如果您加载管理页面,则从 wp-admin/index.php 开始。主要功能是加载Wordpress环境和模板:

/** Loads the WordPress Environment and Template */
require DIR . ‘/wp-blog-header.php’;

2.加载wp-博客标题.php:wp-blog-header.php
wp-blog-header.php 做了三件事:加载 wp-load.php;设置了整个 WordPress 环境; 然后执行 wp-includes/functions.php 中的 wp() 函数来加载查询。 template-loader.php 决定应该加载哪个模板。

3.wp-load.php
该文件检查 wp-config.php,如果找到,则继续环境设置过程。 如果没有 wp-config.php,Wordpress 会假定它是新安装。 然后它会加载安装屏幕。

4.wp-config.php:在每个 wp-config.php 文件的末尾,都需要 wp-settings.php。 这是设置过程真正开始的地方。

5.WP-设置.PHP:wp-settings.php
在此文件的顶部,加载了其他三个文件:

load.php(在 wp-includes 中)——这提供了 WordPress 需要的第一个功能。 其中大多数涉及规范服务器、检查维护模式是否处于活动状态、检查调试模式是否处于活动状态等……
default-constants.php(也在 wp-includes 中)——设置很多常量。 如果它们没有在 wp-config.php 中定义
version.php(同样,wp-includes)——定义版本/所需版本的非常简单的文件

6.FUNCTIONS.PHP、WP 类和插件 API
然后 WordPress 运行 load.php中 的函数。 第一个函数主要用于“规范化”服务器。

从评论“加载早期 WordPress 文件”中,加载的第一个功能不仅仅是设置。

compat.php 添加了一些旧 PHP 版本中缺少的额外功能。 WordPress 确实致力于支持非常旧的 PHP 版本。

functions.php 是运行您的网站的最基本功能的地方。 它们包括用于序列化数据的函数(例如 post_meta)、日期函数、处理获取查询、随机数等等……

class-wp.php 实际上构建查询、处理查询变量并进行设置。 它是在 wp-settings.php 末尾附近实例化的对象

class-wp-error.php 是一个可以在您自己的插件中使用的类来跟踪错误。 它是作为 try/catch 的替代品引入的,并返回特定的 WP_Error 对象。

现在plugin.php 已加载。 是另一个重要的文件。 它提供了操作和过滤器挂钩所需的功能。 这些允许改变核心文件和插件的行为,而无需触及原始代码。

最后,在这一系列要求中,WordPress 加载 mo.php 来处理翻译文件。

7.设置数据库类和缓存
然后,调用 require_wp_db() 和 wp_start_object_cache() (来自 load.php)。 它们提供与数据库和缓存的连接。 它们还允许您使用插件。 这意味着您可以在此处替换默认的类和功能。

8.默认过滤器.PHP
这是一个设置了很多过滤器和操作的文件。 这真的很有趣。 您可以检查此列表以了解删除它们的优先级。

9.多站点启动
如果您在 wp-config 中设置多站点,WordPress 现在会加载必要的功能 (ms-blogs.php) 并启动多站点所需的所有功能 (ms-settings.php,其概念与 wp-settings 类似)。 另请注意,ms-settings 可以加载 sunrise.php dropin,该 dropin 可以更改多站点的工作方式。

10.基本加载结束
执行到这里,WordPress 已完成其主要功能的加载。 它添加了一个在 PHP 关闭后运行的钩子 (shutdown_action_hook)(通过 register_shutdown_function)。

钩子在这里定义,因为在它之后,有一个对 SHORTINIT 常量的检查。 如果您只需要加载 WordPress 的基础知识,您可以在插件或主题中定义此常量。 例如,如果您想加快 Ajax 调用速度或在 WordPress 上构建某种 API。

11.加载大部分 WORDPRESS
翻译 API 已加载,WordPress 会进行最终检查以查看是否需要安装该网站。

下面的一长串需求加载了为您提供完整 WordPress 核心功能的所有函数和类。 它是函数和类的折衷组合,提供诸如构建菜单、权限和用户管理等功能。 每个文件都需要一篇博客文章来介绍它们的工作方式。

12.加载必须使用插件
在加载必须使用的插件之前,会设置额外的默认常量,这些常量需要比在开头的 wp_initial_constants 设置的 API 加载更多的 API设置。

必须使用的插件是您无法通过正常的插件管理屏幕进行管理的插件。 如果您正在构建一个应用程序,其中最终用户启用/禁用应用程序的某些部分是没有意义的,那么它们非常有用。

必须使用插件的另一个用途是在所有其他插件之前加载的插件,因为普通插件只会在 wp-settings 中进一步加载。

加载必须使用的插件后,您将获得可以调用的最早的钩子:muplugins_loaded – 请注意,此时仍然没有加载“正常”插件。

默认分类法和帖子类型
WordPress 现在设置了一堆额外的常量和变量(其中包括用户代理,如果站点使用 SSL 等)。

然后,它继续设置默认的帖子类型和分类(帖子、页面、附件、类别、标签……)

加载普通插件
设置主题目录后,WordPress 会加载“普通”插件,如选项 active_plugins 中所定义。 它还加载可插拔,其中包括您可以轻松地从主题或插件覆盖的功能。

加载所有插件后,您将获得另一个早期钩子:plugins_loaded。 此时,所有插件都已加载,并且它们的功能和挂钩可供您使用。

创建全局对象
WordPress 现在创建全局可用的对象(wp、wp_query,…)。 这些保存诸如当前查询之类的内容。

选择主题
WordPress 现在检查哪个主题处于活动状态并加载该主题的functions.php 文件。 另请注意,这里有两个额外的钩子,一个在选择主题之前,一个在选择主题之后运行。

初始化钩子
WP 对象现在运行它的 init 操作,该操作填充当前用户。 完成后,您将获得著名的 init 挂钩。 许多插件和主题都使用这个钩子。 WordPress 功能的整个核心已加载并填充当前用户。

WP_LOADED 钩子
如果您的站点是多站点,WordPress 将检查当前站点是否完全活跃。

因此,如果您有一个多站点(或者想在大多数插件加载后触发一个函数),那么 wp_loaded 钩子是一个很好的选择。

你可能认为它可能永远不会结束,但这实际上结束了 wp-settings.php

WP()
至此,所有核心功能均可用,WordPress 已加载。 然而,尚未向浏览器写入任何内容。

还记得 wp-blog-header.php 吗? 它需要 wp-load.php(这需要 wp-config.php,而 wp-config.php 又需要 wp-settings.php,它加载整个 WordPress API 并将我们带到了这一点)。

现在 wp() 函数(在 wp-includes/functions.php 中)运行。 它使用 WP 对象并运行其主要操作。 这会检查 URL 并构建所需的查询以获取此页面所需的数据。

模板加载器.PHP
现在是启动过程的最后部分。 所有功能均可用(wp-settings.php)并且所需数据已加载(functions.php 中的 wp())。

然后调用 template-loader.php(来自 wp-load.php)。 该文件决定加载哪个模板。

它做的第一件事就是给你一个钩子:template_redirect。 如果您知道(根据加载的数据)您将需要一个替代模板而不是通常加载的模板,那么这就是您的钩子。 例如,如果当前用户未登录,则加载登录表单的受限页面。

接下来,WordPress 检查当前请求是否为 http head 请求。 这些用于获取 http 标头(例如,检查某个页面是否存在、是否已更改……)。 如果检测到此类请求,则不会呈现页面的其余部分。 如果您收到大量此类请求,这可以为您节省一些服务器带宽。

template-loader.php 然后检查 3 种特殊情况:机器人(Googlebot 索引您的页面)、被读取为 RSS 提要或引用的页面。 如果找到其中任何一个,则不需要加载普通的模板文件。

如果不是特殊情况,WordPress 会浏览可能的模板列表。 每行首先检查是否满足条件(is_404(),is_search(),…)。 如果满足条件,则检查当前主题中是否存在相应的模板。 如果找到匹配项,该值将保存在 $template 变量中。

如果不需要加载(或可用)任何特殊模板,则将默认索引模板保存到变量中。

在最终包含它之前,您会得到最后一个过滤器(template_include),并且您最终会在浏览器中看到结果。

news via inbox

Nulla turp dis cursus. Integer liberos  euismod pretium faucibua

Leave A Comment