WordPress开发:WordPress动作钩子之add_action和do_action使用样例

操作环境

操作系统信息:

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插件开发:实现插件的注册,注销和卸载

  • 在本文的样例中,我们需要用到 WordPress 平台提供的两个动作钩子函数,如下:
add_action
do_action

WordPress 平台开发中常见的钩子有两种,一种是过滤钩子,另一种是动作钩子,add_actiondo_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 所示:

图 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


荒原之梦网全部内容均为原创,提供了涵盖考研数学基础知识、考研数学真题、考研数学练习题和计算机科学等方面,大量精心研发的学习资源。

意见反馈 | 内容纠错 | 微信 | QQ | 公众号 | 知乎 | 微博 | 博客园 |CSDN | B 站 | 电子邮件
豫 ICP 备 17023611 号-1 | 公网安备 - 荒原之梦 豫公网安备 41142502000132 号 | SiteMap
Copyright © 2017-2024 ZhaoKaifeng.com 版权所有 All Rights Reserved.

Copyright © 2024   zhaokaifeng.com   All Rights Reserved.
豫ICP备17023611号-1
 豫公网安备41142502000132号

荒原之梦 自豪地采用WordPress