欢迎莅临阿Q的项目

专业WP商业设计开发销售中心

[手冊]WordPress插件API:Hooks(钩子程序)

钩子是 WordPress 的精髓。他们允许插件开发人员钩进 WordPress 工作流程内部来改变它的工作,而不用直接修改核心代码。这就使得用户可以方便的升级到 WordPress 的新版本而不需要修改一行代码。

激活、停用、卸載插件

插件 activation 函数

插件 activation 函数,当一个插件在 WordPress 中”activated(启用)”时被触发。

使用这个函数可以用来为插件设置一些默认选项。也可以用来验证插件和 WordPress 版本的兼容性。这个插件接收两个参数:

<?php
register_activation_hook( $file, $function );

参数:

  • $file — (string)(必须) — 主插件文件的路径。
  • $function — (string)(必须) — 当插件启用时要执行的函数。

下面是一个例子:

<?php
register_activation_hook( __FILE__, 'boj_myplugin_install');
functionboj_myplugin_install() {
	// 启用时要做的事情
}

第一个参数是插件的路径,使用了 __FILE__ 常量。这个一个 PHP 自带的常量,指向调用它的文件的 绝对路径。第二个参数是唯一的一个函数名。

知道了 register_activation_hook() 函数的用处后,我们看一个真实的例子。下面的例子用来验证 WordPress 的版本:

<?php
register_activation_hook( __FILE__, 'boj_install');
function boj_install() {
	if( version_compare( get_bloginfo( 'version' ), '3.1', '<' ) ) {
		deactivate_plugins( basename( __FILE__ )); //禁用插件
	}
}

我们使用 get_bloginfo() 函数来取得当前安装的 WordPress 版本号。接着用 PHP 函数 version_compare() 来验证安装的 WordPress 的版本是否至少为 3.1。如果低于 3.1,就调用 deactivate_plugins() 函数来 禁用插件。

在启用时进行默认设置

另一个常用的启用技术就是在你的插件启用时为它设置默认选项。假设你的插件有许多许多选项,也许有一些选择需要被设置才能保证插件正常工作。你可以再启动时自动设置默认值,而不用让用户跑到设置页面来亲自设置。

<?php
register_activation_hook( __FILE__, 'boj_install');
function boj_istall() {
  $boj_myplugin_options = array(
    'view' => 'grid',
    'food' => 'bazon',
    'mode' => 'zombie'
  );
  update_option( 'boj_myplugin_options', $boj_myplugin_options );
}

上面的代码在你插件启用时生成了一个包含默认值的数组并把它们存到 WordPress 中。

插件 deactivation (禁用)函数

和启用函数类似,同样有禁用函数。叫做 register_deactivation_hook() 函数。这个函数在插件被禁用时触发。这个函数和前面的启用函数一页同样接收两个参数。

<?php
register_deactivation_hook( $file, $function );

参数:

  • $file — (string)(必须) — 主插件文件的路径。
  • $function — (string)(必须) — 当插件禁用时要执行的函数。

下面是一个例子:

<?php
register_deactivation_hook( __FILE__, 'boj_myplugin_uninstall' );
function boj_myplugin_unstall() {
	// 执行内容
}

在禁用插件时执行 boj_myplugin_uninstall() 函数。

禁用 != 卸载

在处理禁用的时候,不应该包含卸载插件的功能。因为禁用了还可以重新启用的,但卸载(删除)就不一样了。注意:WordPress 在自动更新的时候,会先禁用所有的插件,然后再安装 WordPress 的新版本。

卸载的方法

为插件提供卸载功能可以方便的删除掉插件添加到 WordPress 中的数据。这应该是每个插件的必须部分。这不会带来多少工作量,但是可以让用户来选择是否完全删除它。

为什么卸载是必须的?

想像一下插件是安装到你电脑中的一个软件。你就希望这个软件有个非常方便的卸载的方法。你同样希望可以彻底卸载该软件的所有内容。WordPress 中的插件也是同样的意思,实质就是安装在 WordPress 中的软件。如果用户希望删除这个插件,你应该为用户提供从 WordPress 中彻底删除它的功能。

关心插件用户的数据是一个良好的规则。例如如果你的插件建立事件作为自定义文章类型,也许用户希望卸载插件,但并不希望删除他们所有的事件。因此你或许希望询问用户是否要删除他们的数据。

WordPress 提供了两种卸载插件的方法:一个是 uninstall.php 文件,另一个是 uninstall 钩子。

uninstall.php

第一种方法:uninstall.php 文件。这是典型的流行方法,因为它把你所有的卸载代码放在一个独立的文件中。要使用这个方法,创建一个 uninstall.php 文件并放置在插件的根目录。如果这个文件存在,WordPress 会在插件被删除的时候执行这个文件的代码。下面是使用 uninstall.php 文件的一个例子:

<?php
// 如果 uninstall 不是从 WordPress 调用,则退出
if( !defined( 'WP_UNINSTALL_PLUGIN' ) )
exit();
// 从 options 表删除选项
delete_option( 'boj_myplugin_options' );
// 删除其他额外的选项和自定义表

第一件要做的事就是验证确实是 WordPress 在调用 uninstall.php 文件。通过严重 WP_UNINSTALL_PLUGIN 常量是否定义。如果没有,立即退出。这是一个保证只有在删除插件时才能够执行 uninstall.php 文件的安全的方法。

在验证了这是合法的卸载调用以后,就可以从数据库中删除插件的设置项了。插件卸载脚本的目的是要从数据库中删除任何与插件相关的内容。这包括删除所有选项,已经删除所有自定义的表。你不需要操心删除插件的文件或者目录的事情,一旦卸载脚本执行了,WordPress 会自动为你做这些事情。

卸载钩子

第二种可用的卸载方法叫做卸载钩子。如果你删除一个不存在 uninstall.php 的插件,WordPress 会执行卸载钩子(如果存在的话).

<?php
register_uninstall_hook( $file, $function );

参数:

  • $file — (string)(必须) — 插件主文件的路径
  • $function — (string)(必须) — 在插件卸载后要执行的函数

下面看卸载函数的例子:

<?php
register_activation_hook( __FILE__, 'boj_myplugin_activate' );
function boj_myplugin_activate() {
  // 注册卸载函数
  register_uninstall_hook( __FILE__, 'boj_myplugin_uninstaller' );
}
function boj_myplugin_uninstaller() {
  // 删除插件创建的选择,表等等
  delete_option( 'boj_myplugin_options' );
}

register_uninstall_hook() 必须在启用函数中调用。因此要在使用 register_activation_hook() 函数执行插件启用的函数中包含 uninstall 钩子。接着调用 uninstall 函数。注意:如果插件根目录下包含 uninstall.php 文件,那么删除钩子是不会执行的。

重要:要知道不能使用一个类的方法作为卸载钩子的回调函数。因为卸载钩子会保存一个 $this 的引用到数据库中,它多那个页面的加载来说是唯一的。

如本节中提醒的,使用卸载钩子有许多陷阱。所以最好使用更简洁的 uninstall.php 文件来进行卸载。

如果喜欢本文,请分享给朋友们