操作环境
操作系统信息:
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