Z-Blog 事件(Hook)设置指南
一、Z-Blog 事件机制原理
Z-BlogPHP 的 Hook 本质是:
$zbp->AddFilter('事件名', '函数名');或者
Add_Filter_Plugin('事件名', '函数名');然后系统在指定位置:
foreach ($GLOBALS['Filter_Plugin_XXX'] as $fpname => &$fpsignal) {
$fpname();
}
二、最简单可运行示例(创建一个插件)
1. 创建插件目录
/zb_users/plugin/myhook/
2. 创建 plugin.xml
<?xml version="1.0" encoding="utf-8"?>
<plugin>
<id>myhook</id>
<name>My Hook</name>
<url></url>
<version>1.0</version>
<author>You</author>
<adapted>1.7</adapted>
</plugin>
3. 创建 include.php
<?php
RegisterPlugin("myhook","ActivePlugin_myhook");
function ActivePlugin_myhook() {
// 注册一个系统事件
Add_Filter_Plugin('Filter_Plugin_ViewPost_Template', 'myhook_test');
}
function myhook_test(&$template) {
global $zbp;
$zbp->header .= "<!-- 文章页被hook了 -->";
}
三、常用事件列表(常见Hook)
| 事件 | 说明 |
|---|---|
Filter_Plugin_ViewPost_Template | 查看文章页面 |
Filter_Plugin_PostArticle_Core | 发布文章时 |
Filter_Plugin_Edit_Response5 | 后台编辑页 |
Filter_Plugin_Admin_TopMenu | 后台顶部菜单 |
Filter_Plugin_Zbp_MakeTemplatetags | 模板标签生成 |
四、如果你要“主动触发”一个 Hook
Z-Blog 的 hook 机制是“广播式”的。
假设你自己写一个 hook:
foreach ($GLOBALS['Filter_Plugin_My_Custom_Event'] as $fpname => &$fpsignal) {
$fpname($data);
}
然后插件里:
Add_Filter_Plugin('Filter_Plugin_My_Custom_Event', 'my_custom_func');
function my_custom_func(&$data) {
$data = '被修改了';
}
五、插件生命周期
如果你想:
插件启用时执行
function InstallPlugin_myhook() {
// 启用时
}
插件卸载时
function UninstallPlugin_myhook() {
}
下面以文章保存时过滤内容(比如替换敏感词、删除某些HTML等)为例子
最合适的 Hook 是:
Filter_Plugin_PostArticle_Core
这个事件发生在文章核心保存逻辑执行前,可以直接修改 $article 对象。
可进入「后台管理」界面,在 应用中心 插件中,通过点击 新建插件 按钮创建应用;
会自动创建相应的文件夹及「自述文件」,并放入「初始文件」。
1. 插件目录
/zb_users/plugin/contentfilter/
初始文件
include.php
logo.png
main.php
plugin.xml
2. include.php
<?php
RegisterPlugin("contentfilter","ActivePlugin_contentfilter");
function ActivePlugin_contentfilter() {
// 文章保存前触发
Add_Filter_Plugin('Filter_Plugin_PostArticle_Core', 'contentfilter_run');
}
function contentfilter_run(&$article) {
// 文章正文
$content = $article->Content;
// 示例1:替换敏感词
$content = str_replace('badword', '***', $content);
// ...
// 重新赋值
$article->Content = $content;
}
原理说明
$article 是一个 Post 对象:
$article->Title$article->Content$article->Intro$article->Tags$article->Category
只要修改 $article->Content,保存时就会写入数据库。
如果你只想在“新发布时”执行(而不是编辑)
可以加判断:
if ($article->ID == 0) {
// 说明是新文章
}
或者判断状态:
if ($article->Status == ZC_POST_STATUS_PUBLISHED) {
// 只对已发布文章处理
}
记得在 插件管理 中启用该插件才能生效。