使用WordPress钩子来清理代码,激活和卸载

插件作者将这么多的时间和精力投入到他们产品的主要功能中,它们允许不太重要的东西落在路边.

例如,采取激活和停用.虽然激活挂钩是广泛的-许多插件需要添加一些选项,刷新重写规则,也许创建数据库表,或检查安装版本差异-取消激活和卸载挂钩远不太常见.

这里的点?许多插件作者没有花时间在自己之后清理.WordPress安装是否真的需要在删除插件后创建的自定义表?为什么不清楚在删除它之前是一个独家插件的一些选项?

在本文中,我将向您展示如何使用激活,取消激活和卸载挂钩来初始化您的插件并更轻松地清除您的产品.

  • 激活钩

    • 安装序列
    • 刷新重写规则
    • 创建数据库表
    • 依赖关系检查

  • 停用钩子
  • 卸载钩子
  • 额外的安全性
  • 现在是时候清理

注意:如果您计划通过本文浏览这篇文章,我强烈建议在最后的"附加安全"部分窥视,这将代码与一些有价值的安全检查补充.此外,如果您需要WordPress插件挂钩的帮助,这里有一个快速进修,使用WordPress钩子以及如何激活WordPress中的函数.

激活挂钩

虽然激活挂钩非常简单,但安装它是一个特殊情况的一点,所以我们需要注意事件的顺序.在我们进入所有这些之前,这是一个简单的例子:

加载GIST F356A899B7F009D136644383339DB4F6

它的键是register_activation_hook()函数.第一个参数是主插件文件的路径;第二个参数定义要运行的函数.在内部,register_activation_hook()函数是"activate_ [plugin_name]"操作的包装器,但由于它更容易使用,因此在插件中看到挂钩是不寻常的.

安装序列

了解安装序列很重要,因为它可以防止您可以使用的方法.在用户点击激活链接之间被调用register_activation_hook(),从而看到激活通知.它在中间页面上运行,在任何钩子可能有机会运行之前立即重定向.

让我们看一下一个例子来看看为什么这是一个巨大的bummer:

刷新重写规则

一些插件创建自定义帖子类型.在激活时刷新重写规则,以确保用户在访问新的自定义后类型的帖子时没有得到404错误是智能移动.

下面的代码似乎是合乎逻辑的,但会失败.

加载GIST 7C656623608EFD1785437EBE7CDB7350

似乎完全罚款.自定义帖子类型是在激活时创建的,刷新重写规则.问题是,当我们刷新重写规则时尚未创建自定义帖子类型.

这是过程流程的外观:

  1. 用户安装插件.
  2. 用户单击激活链接.
  3. 中介页面仅运行激活挂钩,没有其他.这刷新了重写规则.
  4. 插件是活动的,代码像往常一样运行.定制帖子类型已注册.

在堆栈溢出上发布的解决方案,由WordPress Codex正式认可,解决了我们的少数问题.该解决方案涉及添加一个选项,以指示刚刚安装了插件.

如果存在此选项,我们会执行我们的激活内容,然后删除它.

这样的东西:

加载GIST 6F0927B3BF9807E426C8778A3BF3A797
p>个人,我不太喜欢这个解决方案.问题是,在每一个页面加载时,请在第8行进行检查.它没有什么可担心的,因为它不会在您的服务器上放入大量负载,它不会减慢您的用户的网站.这是一个非常快速的检查,对性能无法忽略不计.然而,它是不必要的99.9%的时间.

flush_rewrite_rules()函数的文档中,在Codex中提到了更好的解决方案.在此解决方案中,我们使用函数的模块化分别在激活时注册定制帖子类型:

加载GIST B44BF08BF511277184A49DE53C0C3ED8

而不是依赖需要一直运行的检查,我们使用激活函数注册我们的帖子类型.请注意,一旦我们的插件激活,帖子类型将始终从init钩子注册.

这是Codex的一个难过的例子.一般来说,WordPress确实有良好的文档,但如果某些事情似乎浪费或不合逻辑,不要害怕做一些对自己的研究.

创建数据库表

某些插件执行的另一个任务是创建数据库表.比不是,这是不必要的,但有一些合法用例.

此示例从Codex文章创建表显示如何使用多个激活呼叫:

加载GIST 9A1D4757D023F2442093A9A158CDB6B4

第一个函数,jal_install()创建一个新的数据库表.第二个函数jal_install_data将初始数据添加到表中.而不是使用register_activation_hook()添加一个包含所有这些代码的函数,我们可以多次使用register_activation_hook.

这是模块化的很好做法.一方面,您没有要添加初始测试数据-它像删除激活挂钩一样简单-因此您可以保持功能完好无损.另一方面,您可以自由地在任何地方重复使用这些功能,因为它们是分开的.

依赖关系检查

激活函数的另一个常见任务是检查依赖项.您的插件可以依赖于WordPress,另一个插件或甚至特定版本的PHP的特定版本.

下面的代码检查最小WP和PHP版本并在必要时重定向用户(无需激活插件):

加载GIST 79A2C5414969291EC90CAC11C38B7522

取消激活钩

在用户停用插件时运行的挂钩运行,但在卸载之前(删除).取消激活钩子以与激活挂钩相同的方式使用:

加载GIST 6ED9BB66EE1863AB3E84DB1F9F753792

取消激活意味着用户只取消激活了您的插件,因此您不会想要尽可能多地执行卸载.您可能希望刷新重写规则,但在此阶段,您不希望摆脱所有选项和数据库表(如果您有一个).

这相当简单,但我会特别注意冲洗重写规则,因为再一次,这些都是有问题的.

Codex建议这样做如下所示,但这个不起作用:

加载GIST 4440A0178B4E34506530E13D0EAD8958

这不起作用的原因与以前相同.运行停用执行init钩子,这意味着随着我们停用我们的插件,我们也注册了我们的自定义帖子类型.重写规则被刷新,但他们考虑了定制帖子类型.

一个trac票就可以解决这个问题,但直到那时,我不能给你一个非常好的方式.我发现工作的唯一方法是完全删除重写规则:

加载GIST 98B496826278084A2F7A5EA27994F781

虽然过去为我工作了,但我不会推荐它.它引入了比拥有额外重写规则的问题更大的不确定性.我宁愿向用户展示一个注释,要求他们在取消激活后访问永久链接设置,这将刷新重写规则.直到实施更好的解决方案,我们陷入了坚持......对不起!

卸载挂钩

卸载插件时有两种方法可以运行代码.您可以通过register_uninstall_hook()使用卸载钩子,或者您可以在插件中使用专用的uninstall.php文件.我会向您展示两个,但首选方法是使用卸载文件.

卸载挂钩的主要问题是"它可以防止在卸载期间运行主插件文件,如果插件在全局空间中运行代码,则可能存在问题.更好的是,卸载代码是集中的."- Scott Riley

下面的代码使用基本钩子显示卸载过程:

加载GIST 040847DB4739148900B1EE29D227D71D

如上所述,这不是最好的解决方案.处理卸载的更好方法是使用uninstall.php文件.您需要做的就是创建它,如果它可用,将使用它.

加载GIST 44DDE25DCB57B4239BE8586F4D04C765

正如您所看到的,这实际上是一个更简单的解决方案.最重要的是,它是独立的.

附加安全性

我不想过度复杂化到目前为止与安全相关的问题显示的例子,但你真的应该采取一些措施来确保只有那些被允许这样做的人可以运行这些动作.

使用以下代码段激活和取消激活:

加载GIST 357037989065F89C15F049314E9831BF.

此代码块确保用户具有执行此操作的权限,并且该操作始于正确的页面.这应该防止最恶劣的尝试.

卸载过程是特殊的,所以我们需要使用略微不同的代码:

加载GIST 541C93CFA9B89E1E6C7B48B06732D31F

它是清理

的时间

如果您的插件将填写器添加到WordPress,那么当用户决定删除插件时,您的职责是开发人员.

使用上面概述的激活,取消激活和卸载方法将允许您构建一个安全和安全的系统.我还强烈建议读取这个stackexchange线程,它概述了OOP环境中的这些进程.

如果您不是WPMU Dev会员,请立即注册免费试用,完全无风险.作为成员,您将获得所有伟大的插件和炽热的托管服务,以及专家24/7支持所有与您的WordPress相关的问题和问题.

12

发表回复