操作环境
操作系统信息:
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 页脚添加联系信息的插件。具体要求如下:
- 插件启动时将硬编码进插件代码中的联系信息(一个邮箱地址)写入数据库;
- 之后,从数据库中取出该联系信息,显示到 WordPress 页脚的位置;
- 插件卸载时能够自动清除之前写入到数据库中的数据。
准备工作
- 本文在插件注册、注销和卸载时使用的代码及解析可以在我的如下博文中找到:
- 在本文的样例中,我们需要用到 WordPress 平台提供的两个动作钩子函数,如下:
add_action do_action
WordPress 平台开发中常见的钩子有两种,一种是过滤钩子,另一种是动作钩子,add_action 和 do_action 都属于动作钩子。
其中,add_action 的作用是:
“Hooks a function on to a specific action.”
即:“挂载一个函数到特定的动作。”
do_action 的作用是:
“Execute functions hooked on a specific action hook.”
即:“执行挂载在特定动作钩子上的函数。”
WordPress Developer Resources 中对 add_action 钩子函数的说明页地址如下:
https://developer.wordpress.org/reference/functions/add_action/
WordPress Developer Resources 中对 do_action 钩子函数的说明页地址如下:
https://developer.wordpress.org/reference/functions/do_action/
实现过程
打开 wp-content/themes 目录下我们当前正在使用的主题的文件夹,可以找到名为 footer.php 的文件。该文件的主要作用是控制 WordPress 的页脚。我们可以在其中找到如下代码:
<?php wp_footer(); ?>
很显然,这里调用了一个函数 wp_footer(), 我们可以在 wp-includes/general-template.php 文件中知道该函数的实现代码,如下:
function wp_footer() {
/**
* Prints scripts or data before the closing body tag on the front end.
*
* @since 1.5.1
*/
do_action( 'wp_footer' );
}
去掉注释看得更清楚:
function wp_footer() {
do_action( 'wp_footer' );
}
从上面的代码中我们可以看到,do_action() 这个动作钩子将唤起 wp_footer 这个动作钩子,并执行其中的代码。
这里需要说明的一点是,wp_footer() 是 WordPress 的一个函数,而 wp_footer 是 WordPress 的一个钩子,二者并不相同。
WordPress Developer Resources 中对 do_action( 'wp_footer' ) 的描述是:
“Prints scripts or data before the closing body tag on the front end.”
即:“在前端的 body 标签结束之前打印及哦啊本或者数据。”
关于 do_action( 'wp_footer' ) 的详情,可以查阅:
https://developer.wordpress.org/reference/hooks/wp_footer/
而 WordPress Developer Resources 中对 wp_footer() 的描述是:
“Fire the wp_footer action.”
即:“启动 wp_footer 动作。”
关于 wp_footer 的详情,可以查阅:
https://developer.wordpress.org/reference/functions/wp_footer/
接下来,我们在插件文件中写入如下代码:
//将 zkf_lianxiwo_insert 函数挂载到 wp_footer 钩子上
add_action("wp_footer", "zkf_lianxiwo_insert");
function zkf_lianxiwo_insert() {
//从数据库中取出名为 zhuce 的记录并输出其值
echo get_option("zhuce");
}
上面代码块中的 add_action("wp_footer", "zkf_lianxiwo_insert"); 这一行代码实际上相当与把函数 zkf_lianxiwo_insert() 添加到了钩子 wp_footer 中,而 wp_footer 这个钩子又被 wp_footer() 所激活,于是,zkf_lianxiwo_insert() 函数的输出结果就被显示在了 wp_footer() 函数所在的位置,也就是 WordPress 站点的页脚处。
插件启用后的显示效果如图 1 所示:

整体目录结构
master@ubuntu:/var/www/html/wp/wp-content/plugins$ tree . ├── a3demo │ ├── a3demo.php │ └── uninstall.php
完整代码
a3demo.php:
<?php
/**
* Plugin Name: Demo3
* 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: Demo3
* Domain Path: /languages
*/
//激活时注册插件
register_activation_hook(__FILE__, 'zkf_demo3_zhuce');
function zkf_demo3_zhuce() {
//插件启动时,向数据库中插入一条数据
//name 为 "zhuce", value 为 "OKOK"
update_option("zhuce", "<p style='color:red'>E-mail: zkf@zkf.email</p>");
}
//停用时注销插件
register_deactivation_hook(__FILE__, 'zkf_demo3_zhuxiao');
function zkf_demo3_zhuxiao() {
//当插件要注销时,向数据库中插入一条数据
//name 为 "zhuxiao", value 为 "OKOK"
//后续可以通过该值判断插件是否停用
update_option("zhuxiao", "OKOK");
}
//将 zkf_lianxiwo_insert 函数挂载到 wp_footer 钩子上
add_action("wp_footer", "zkf_lianxiwo_insert");
function zkf_lianxiwo_insert() {
//从数据库中取出名为 zhuce 的记录并输出其值
echo get_option("zhuce");
}
?>
uninstall.php:
<?php
//若卸载操作不是来自 WordPress, 则终止执行
if(!defined('WP_UNINSTALL_PLUGIN'))
exit();
//删除当前插件在数据库中插入的数据
delete_option('zhuce');
delete_option('zhuxiao');
?>
EOF