WordPress 开发:钩子 创建一个自定义插件

本文由清尘发表于2019-04-01 15:38最后修改于2019-04-26属于WordPress分类

创建一个自定义插件

创建一个自己的 WordPress 插件,你需要先让 WordPress 知道我们的插件 .. 一般插件可以放在 wp-content 下面的 plugins 这个目录的下面 .. 这个目录你也可以通过一些配置去改变它的位置 .. 不过默认 WordPress 就是在这个目录的下面去寻找可用的插件 ..

在它下面创建一个新的目录 .. 目录的名字可以是插件的名字 .. 比如我要创建一个演示的插件,名字可以是 hello-demo .. 在这个目录的下面,再添加一个 php 文件 .. 它的名字是 hello-demo.php

<?php

/*
Plugin name:hello demo
Plugin URI:https://blog.ipsfan.com
Description:演示自定义插件
Author:shine
Author URI:https://blog.ipsfan.com
Version:1.0
 */

在wordpress管理后台-插件里启用一下刚刚创建的插件

使用 Hooks 扩展 WordPress

插件的作用主要就是去修改 WordPress,让它拥有我们想要的结果。一般我们不会直接去修改 WordPress 的核心文件,这样在升级 WordPress 以后所有的修改就不见了。

正确的做法就是使用 Hooks,中文可以翻译成钩子。Hooks 就是 WordPress 给我们提供的一些接口,通过这些接口我们就可以去修改 WordPress。

比如用户请求 WordPress 的一个页面,WordPress 根据请求为用户返回对应的内容,WordPress 加工这个内容的过程有点像是一个产品的流水线 … Hooks 就是在这条流水线上的不同的步骤 .. 你可以根据自己的需求在这条流水线上加上自己的东西。

WordPress 的 Hooks 有两种类型,一种叫 Action Hook, Action 就是动作的意思,这种类型的 Hook 会在 WordPress 做某些动作的时候被执行,比如保存文章,发表评论等等 ..

还有一种是 Filter Hook ,这种类型的 Hook 的功能一般就是修改内容,然后返回修改之后的内容,比如你想修改文章的标题,加上某种特殊的 HTML 标记等等。

找到合适的 Hooks

找到合适的 Hooks ,可以看这篇文章: https://codex.wordpress.org/Plugin_API 这篇文章介绍了 WordPress 插件 API 的基本使用方法 ..

还有就是这个 Action Reference:https://codex.wordpress.org/Plugin_API/Action_Reference 这里面列出了 WordPress 提供的一些 Action Hook ,我们可以搜索这个页面上的内容,找到自己需要的 Hook ..

搜索一下 .. dashboard , 我们可以根据 hook 的名字,还有描述来判断是不是自己需要用的 Hook …

这里还有一个 Filter Hook 的参考:https://codex.wordpress.org/Plugin_API/Filter_Reference
另外我们也可以使用搜索 .. 打开这个 https://developer.wordpress.org/reference/

可以选择一下要搜索的东西的类型 .. 比如我要搜索一下 Hooks .. 勾选一下它 .. 然后再使用关键词去搜索 .. 比如我想找一下跟 comment ,评论相关的 Hook ..

输入 comment .. 搜索一下 .. 这里列出的就是跟 comment 相关的 hook .. 在结果里面会包含 hook 的名字 .. 它的类型,是 filter hook 还是 action hook ..

另外还有一小段描述 .. 我们可以根据这些信息来判断是不是自己需要的东西 ..

我们可以找开一个 hook 看一下 .. 比如这个 comment post .. 打开它 .. 这样会显示这个 hook 的详细页面,上面会告诉我们这个 hook 的出处 … 它支持的一些参数 .. 还有一些其它的东西 …

在页面的底部也可能会显示社区里的用户贡献的一些使用的例子 … 这些都是很好的参考 …

Action Hook:做你想做的事

我们可以在 WordPress 发生某些事件的时候去执行自己需要的动作,比如保存文章,发布评论,改变文章的状态等等,在我们自己的插件里可以定义一些动作,然后把它们绑定到指定的事件上去执行。

这种东西就是 Action Hook,在插件里定义自己想干的事儿,找到 WordPress 提供的合适的接口,也就是 Action Hook ,然后再把我们自己的动作挂到上面去执行。

比如我想在用户的文章被发布以后,给文章的作者发一封通知的邮件 .. 我们可以先去定义这个发送邮件的动作 … 在我们自己的插件里面,添加一个函数 .. 名字可以自己定义,要注意这个函数的名字不能跟 WordPress 的其它函数的名字有冲突 .. 最好可以在自己的插件里面使用 class ..

挂载动作:add_action

定义好了要执行的动作,我们需要再去找一个合适的地方去使用它 .. 比如我想要的是用户的文章被发布以后,去发送邮件通知用户 ..

我们可以在这个 Action_Reference 里面找一下 .. 或者也可以直接在 wordpress 的 developer 网站上的 reference 里面搜索一下 ..

这里我找到了一个自己想要的 Hook ,就是这个 publish_post ,看名字大概可以猜到它会在什么时候被执行 … 再看一下它的描述 .. Runs when a post is published .. 这样大概就可以确定这是我需要用的东西。

在 hook 上挂载我们自己定义的动作,要用到一个叫 add_action 的函数 … 它有几个参数,第一个参数是 hook 的名字 .. 第二个参数是我们自己定义的动作的名字 .. 第三个参数是一个优先级 .. 默认是 10 .. 第四个参数是支持的参数的数量 ..

<?php

/*
Plugin name:hello demo
Plugin URI:https://blog.ipsfan.com
Description:演示自定义插件
Author:shine
Author URI:https://blog.ipsfan.com
Version:1.0
 */

function shine_notification($ID,$post){
  $author = $post->post_author;
  $email = get_the_author_meta('user_email',$author);
  wp_mail($email,'内容已发布',$post->post_title);
}

add_action('publish_post','shine_notification',10,2);

Filter Hook:在做事之前先加工处理一下数据

Filter 就是处理 WordPress 数据用的一种东西,也就是在 WordPress 要执行某些动作之前,数据有机会被 Filter 先处理加工一下,然后再去执行指定的动作。比如在把数据放到数据库里,或者输出到用户的浏览器上 .. Filter 就是在它们之间的一种东西 ..

WordPress 提供了很多 Filter Hook .. 我们可以根据自己的需求找到对应的 Filter Hook 去使用。你可以先在插件里定义自己的 Filter ,也就是你想怎么样处理需求的数据,然后再把它挂载到对应的 Filter Hook 上面去执行。这样 WordPress 就会在某个特定的时机去执行我们定义的这些 Filter 来处理加工数据了 ..

比如有些特别的原因,我希望可以在页面的 body 标签里面添加一个自己需要的 class .. 先定义一个函数 .. 名字可以是 shine_body_class .. 它支持一个参数,就是 $classes .. 也就是应用在 body 标签上的 class 的名字 ..

这个参数的值是一个数组 .. $classes[] .. 等号的右边就是想要添加的 css 类的名字 .. 比如添加一个 red .. 把这个类的列表以后我们需要在方法里面返回加工之后的数据 .. 这里返回的就是 $classes ..

下面我们要做的就是去找一个合适的 filter hook ..

挂载 Filter:add_filter

<?php

/*
Plugin name:hello demo
Plugin URI:https://blog.ipsfan.com
Description:演示自定义插件
Author:shine
Author URI:https://blog.ipsfan.com
Version:1.0
 */

function shine_body_class($classes){
  $classes[] = 'red';
  return $classes;
}

add_filter('body_class','shine_body_class');

保存一下文件 .. 回到 WordPress 的前台页面 .. 检查一下 … 找到 body 这个元素 .. 你会看到,这个元素上面使用了我们自己在插件里面为它添加的这个 red 类 …