WordPress开发:一个动作钩子可以挂载多个动作,以wp_footer钩子为例

操作背景

操作系统信息:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
master@ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
master@ubuntu:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.6 LTS Release: 16.04 Codename: xenial
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动作钩子之add_action和do_action使用样例》中,提到了 add_actiondo_action 两个动作钩子,以及 WordPress 页脚钩子 wp_footer, 本文将在《WordPress开发:WordPress动作钩子之add_action和do_action使用样例》这篇文章的基础上,通过补充一些代码的方式,说明在一个动作钩子上挂载多个动作的实现方式。

实现过程

在 WordPress 中,一个动作钩子就像当于一个插入接口,通过这些插入接口,我们可以把一些自定义的动作(通常是一个函数)接入 WordPress 中,WordPress 在运行过程中会自动加载这些动作并执行其中的操作。挂载一个动作并使其能够在预设节点被执行,需要两个动作钩子配置完成,分别是用于挂载动作的 add_action 钩子和用于执行动作的 do_action 钩子。

一个 add_action 钩子能够实现一个动作的挂载,若需要挂载多个动作到同一个钩子,就需要写多个 add_action 动作钩子来实现。而 do_action 动作钩子在激活其要执行的钩子钩子,会把该钩子内的所有可以被执行的操作都执行一遍。例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_action("A", "B");
add_action("A", "C");
do_action("A");
add_action("A", "B"); add_action("A", "C"); do_action("A");
add_action("A", "B");
add_action("A", "C");
do_action("A");

在如上所示的伪代码中,我们使用两个 add_action 动作钩子将两个动作(函数)A 和 B 挂在到了钩子 A 上,这样,当钩子 A 被 do_action 动作钩子激活的时候,A 上的两个动作 B 和 C 都会被执行。这样就实现了一个动作钩子挂载多个动作的目的。

具体实现如下。

我们在插件文件 a3demo.php 中定义一个函数作为第一个动作,该动作的目的是打印一行字 “First”:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//挂载第一个动作函数 zkf_first()
add_action("wp_footer", "zkf_first");
//定义第一个动作函数 zkf_first()
function zkf_first() {
//从打印 "First"
echo "<p style='color:red'>First</p>";
}
//挂载第一个动作函数 zkf_first() add_action("wp_footer", "zkf_first"); //定义第一个动作函数 zkf_first() function zkf_first() { //从打印 "First" echo "<p style='color:red'>First</p>"; }
//挂载第一个动作函数 zkf_first()
add_action("wp_footer", "zkf_first");

//定义第一个动作函数 zkf_first()
function zkf_first() {
    //从打印 "First"
    echo "<p style='color:red'>First</p>";
}

同样地,定义并挂载第二个动作:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//挂载第二个动作函数 zkf_second()
add_action("wp_footer", "zkf_second");
//定义第二个动作函数 zkf_second()
function zkf_second() {
//从打印 "First"
echo "<p style='color:red'>Second</p>";
}
//挂载第二个动作函数 zkf_second() add_action("wp_footer", "zkf_second"); //定义第二个动作函数 zkf_second() function zkf_second() { //从打印 "First" echo "<p style='color:red'>Second</p>"; }
//挂载第二个动作函数 zkf_second()
add_action("wp_footer", "zkf_second");

//定义第二个动作函数 zkf_second()
function zkf_second() {
    //从打印 "First"
    echo "<p style='color:red'>Second</p>";
}

以上,zkf_first()zkf_second 两个动作都挂载到了钩子 wp_footer 上,当 wp_footer 这个钩子被 do_action 动作钩子激活时,zkf_first()zkf_second 两个动作都会被执行。

插件激活后的运行效果如图 1 所示:

图 1.

整体目录结构

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
master@ubuntu:/var/www/html/wp/wp-content/plugins$ tree
.
├── a3demo
│ ├── a3demo.php
│ └── uninstall.php
master@ubuntu:/var/www/html/wp/wp-content/plugins$ tree . ├── a3demo │ ├── a3demo.php │ └── uninstall.php
master@ubuntu:/var/www/html/wp/wp-content/plugins$ tree
.
├── a3demo
│   ├── a3demo.php
│   └── uninstall.php

完整代码

a3demo.php:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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_first()
add_action("wp_footer", "zkf_first");
//定义第一个动作函数 zkf_first()
function zkf_first() {
echo "<p style='color:red'>First</p>";
}
//挂载第二个动作函数 zkf_second()
add_action("wp_footer", "zkf_second");
//定义第二个动作函数 zkf_second()
function zkf_second() {
echo "<p style='color:red'>Second</p>";
}
?>
<?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_first() add_action("wp_footer", "zkf_first"); //定义第一个动作函数 zkf_first() function zkf_first() { echo "<p style='color:red'>First</p>"; } //挂载第二个动作函数 zkf_second() add_action("wp_footer", "zkf_second"); //定义第二个动作函数 zkf_second() function zkf_second() { echo "<p style='color:red'>Second</p>"; } ?>
<?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_first()
add_action("wp_footer", "zkf_first");

//定义第一个动作函数 zkf_first()
function zkf_first() {
    echo "<p style='color:red'>First</p>";
}

//挂载第二个动作函数 zkf_second()
add_action("wp_footer", "zkf_second");

//定义第二个动作函数 zkf_second()
function zkf_second() {
    echo "<p style='color:red'>Second</p>";
}

?>

uninstall.php:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
//若卸载操作不是来自 WordPress, 则终止执行
if(!defined('WP_UNINSTALL_PLUGIN'))
exit();
//删除当前插件在数据库中插入的数据
delete_option('zhuce');
delete_option('zhuxiao');
?>
<?php //若卸载操作不是来自 WordPress, 则终止执行 if(!defined('WP_UNINSTALL_PLUGIN')) exit(); //删除当前插件在数据库中插入的数据 delete_option('zhuce'); delete_option('zhuxiao'); ?>
<?php
//若卸载操作不是来自 WordPress, 则终止执行
if(!defined('WP_UNINSTALL_PLUGIN'))
exit();

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

EOF


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

豫 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