WordPress插件开发:实现插件的注册,注销和卸载

操作环境

操作系统信息:

master@ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:    16.04
Codename:    xenial

WordPress 信息:

主程序版本:WordPress 5.3.2
主题及版本:Twenty Sixteen(版本:2.0, 由WordPress团队开发)

创建插件注册函数

我们可以使用如下函数注册 WordPress 插件:

register_activation_hook( string $file, callable $function )

WordPress Codex 中对该函数的说明地址如下:

https://codex.wordpress.org/Function_Reference/register_activation_hook

WordPress Developer Resources 中对该函数的说明地址如下:

https://developer.wordpress.org/reference/functions/register_activation_hook/

register_activation_hook 函数的使用样例如下:

function myplugin_activate() {

    // Activation code here...
}
register_activation_hook( __FILE__, 'myplugin_activate' );

register_activation_hook( __FILE__, 'myplugin_activate' ); 这个函数注册一个钩子,在插件被激活之后,这个钩子就会被唤起,被唤起的钩子会使用钩子函数中传入的函数名称取代插件本身的名称。

简言之就是,当插件启用之后,会使用 register_activation_hook( __FILE__, 'myplugin_activate' ); 函数注册一个钩子,告诉 WordPress 去运行 myplugin_activate() 这个函数。

在实际操作时,为了防止我们自己定义的函数和 WordPress 中已有的函数发生重名的情况,我们最好在自己定义的函数名称中加入一个独特的前缀,例如我这里就把所有我自己定义的函数,都加上 “zhaokaifeng” 的简写 “zkf” 作为前缀。

下面我们开始编写在 WordPress 平台注册插件的代码:

//激活时注册插件
register_activation_hook(__FILE__, 'zkf_demo2_zhuce');

function zkf_demo2_zhuce() {

    //插件启动时,向数据库中插入一条数据
    //name 为 "zhuce", value 为 "OKOK"
    update_option("zhuce", "OKOK");
}

上面的这段代码中使用了一个 WordPress 函数:

update_option();

update_option("zhuce", "OKOK"); 的作用是在 WordPress 站点数据库的 option 表中插入一条名称为 zhuce, 值为 OKOK 的记录。

WordPress Developer Resources 中对该函数的说明地址如下:

https://developer.wordpress.org/reference/functions/update_option/

创建插件注销函数

注销插件,也就是停用一个插件,需要用到如下函数:

register_deactivation_hook( string $file, callable $function )

register_deactivation_hook() 会在插件被禁用时唤起一个钩子并执行钩子内的函数。在这里,我们将这个函数命名为 zkf_demo2_zhuxiao, 该函数实现的功能就是向 WordPress 站点数据库的 option 表中插入一条名称为 “zhuxiao”, 值为 “OKOK” 的记录。具体实现代码如下:

//停用时注销插件
register_deactivation_hook(__FILE__, 'zkf_demo2_zhuxiao');

function zkf_demo2_zhuxiao() {
    //当插件要注销时,向数据库中插入一条数据
    //name 为 "zhuxiao", value 为 "OKOK"
    //后续可以通过该值判断插件是否停用
    update_option("zhuxiao", "OKOK");
}

编写插件卸载脚本

在上面的注册与注销插件的过程中,我们都向数据库中写入了数据。那么,在卸载插件的时候,我们希望不仅仅删除插件所对应的文件,同时也要删除写入到数据库中的信息,这个时候,就需要建立插件卸载程序。

WordPress 平台本身也为我们的这个需求提供了支持。

我们需要在插件的根目录下创建一个名为 uninstall.php 的文件,这样,每当我们在 WordPress 仪表盘插件管理页面点击“删除”按钮删除对应的插件时,WordPress 都会去看看该插件的根目录下是否有一个名为 uninstall.php 的文件,如果有,则会执行其中的代码。

为了防止 uninstall.php 这个文件被错误或恶意调用,我们需要在文件的开头写入如下代码:

//若卸载操作不是来自 WordPress, 则终止执行
if(!defined('WP_UNINSTALL_PLUGIN'))
exit();

上面这段代码的作用是检测调用操作的来源是不是 WordPress 的插件卸载进程,如果是,则继续向下执行,如果不是,则退出程序,插件不会被卸载。

之后,定义数据库清理操作:

//删除当前插件在数据库中插入的数据
delete_option('zhuce');
delete_option('zhuxiao');

清理数据库用到了 WordPress 提供的 delete_option() 函数,该函数可以删除 WordPress 站点中 option 表内特定名称的记录。

WordPress Developer Resources 中对该函数的说明地址如下:

https://developer.wordpress.org/reference/functions/delete_option/

这样一来,当我们在 WordPress 控制面板的插件管理页面点击“删除”按钮删除对应的插件时,该插件的文件及该插件写入到数据库中的信息都会被删除。

注意:执行删除(卸载)操作会删除文件和数据,在此之前请根据自己的实际情况做好相关文件和数据的备份工作!

如果删除插件时出现错误提示:“未能完整移除插件xxx”,这很有可能是文件所属组和所属用户以及文件权限设置的问题,正常设置后即可顺利删除插件。

整体文件结构

master@ubuntu:/var/www/html/wp/wp-content/plugins$ tree
.
├── a2demo
│   ├── a2demo.php
│   └── uninstall.php

完整代码

a2demo.php:

<?php
/**
 * Plugin Name:       Demo2
 * Plugin URI:        https://zhaokaifeng.com/
 * Description:       A WordPress plugin demo.
 * Version:           0.0.1
 * Requires at least: 5.2
 * Requires PHP:      7.4
 * Author:            ZhaoKaifeng
 * Author URI:        https://zhaokaifeng.com/
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       Demo2
 * Domain Path:       /languages
 */

//激活时注册插件
register_activation_hook(__FILE__, 'zkf_demo2_zhuce');

function zkf_demo2_zhuce() {

    //插件启动时,向数据库中插入一条数据
    //name 为 "zhuce", value 为 "OKOK"
    update_option("zhuce", "OKOK");
}

//停用时注销插件
register_deactivation_hook(__FILE__, 'zkf_demo2_zhuxiao');

function zkf_demo2_zhuxiao() {
    //当插件要注销时,向数据库中插入一条数据
    //name 为 "zhuxiao", value 为 "OKOK"
    //后续可以通过该值判断插件是否停用
    update_option("zhuxiao", "OKOK");
}
?>

uninstall.php:

<?php
//若卸载操作不是来自 WordPress, 则终止执行
if(!defined('WP_UNINSTALL_PLUGIN'))
exit();

//删除当前插件在数据库中插入的数据
delete_option('zhuce');
delete_option('zhuxiao');
?>

EOF