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

操作环境

操作系统信息:

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 页脚的位置;
  • 插件卸载时能够自动清除之前写入到数据库中的数据。

准备工作

  • 本文在插件注册、注销和卸载时使用的代码及解析可以在我的如下博文中找到:

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

  • 在本文的样例中,我们需要用到 WordPress 平台提供的两个动作钩子函数,如下:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_action
do_action
add_action do_action
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 的页脚。我们可以在其中找到如下代码:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php wp_footer(); ?>
<?php wp_footer(); ?>
<?php wp_footer(); ?>

很显然,这里调用了一个函数 wp_footer(), 我们可以在 wp-includes/general-template.php 文件中知道该函数的实现代码,如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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() { /** * Prints scripts or data before the closing body tag on the front end. * * @since 1.5.1 */ do_action( 'wp_footer' ); }
function wp_footer() {
        /**
         * Prints scripts or data before the closing body tag on the front end.
         *
         * @since 1.5.1
         */
        do_action( 'wp_footer' );
}

去掉注释看得更清楚:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function wp_footer() {
do_action( 'wp_footer' );
}
function wp_footer() { 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/

接下来,我们在插件文件中写入如下代码:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//将 zkf_lianxiwo_insert 函数挂载到 wp_footer 钩子上
add_action("wp_footer", "zkf_lianxiwo_insert");
function zkf_lianxiwo_insert() {
//从数据库中取出名为 zhuce 的记录并输出其值
echo get_option("zhuce");
}
//将 zkf_lianxiwo_insert 函数挂载到 wp_footer 钩子上 add_action("wp_footer", "zkf_lianxiwo_insert"); function zkf_lianxiwo_insert() { //从数据库中取出名为 zhuce 的记录并输出其值 echo get_option("zhuce"); }
//将 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.

整体目录结构

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_lianxiwo_insert 函数挂载到 wp_footer 钩子上
add_action("wp_footer", "zkf_lianxiwo_insert");
function zkf_lianxiwo_insert() {
//从数据库中取出名为 zhuce 的记录并输出其值
echo get_option("zhuce");
}
?>
<?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"); } ?>
<?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:

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