Z-Blog 插件开发:Filter 钩子与 Include 钩子的实际分工

· zblog · 阅读 13
摘要

写 Z-Blog 插件绕不开两类钩子:Filter 和 Include。名字看着像,用途却完全不同,混用会出问题。Filter:改数据Filter 钩子的作用是拦截并修改数据。挂上之后拿到一个值,返回修改后的值,系统继续往下走。典型如 Fi

写 Z-Blog 插件绕不开两类钩子:Filter 和 Include。名字看着像,用途却完全不同,混用会出问题。

Filter:改数据

Filter 钩子的作用是拦截并修改数据。挂上之后拿到一个值,返回修改后的值,系统继续往下走。典型如 Filter_Plugin_Index_Begin、Filter_Plugin_Post_Core_Save。

function myplug_filter_post(&$post){
    $post->Title = $post->Title . ' | 本站原创';
}
$zbp->Add_Filter_Plugin('Filter_Plugin_Post_Core_Save','myplug_filter_post');

关键点:参数是引用传递,直接改对象属性即可;返回值可有可无,但不要返回一个不相关的值把链路打断。

Include:插内容

Include 钩子只做一件事——在某个位置输出一段 HTML。它不改数据,只往页面上塞东西。典型如 Filter_Plugin_Admin_LeftMenu、主题里的各种 Add_Filter_Plugin。

最容易踩的坑

  • 在 Include 钩子里读取并修改全局对象,指望页面数据被改掉——不会生效,因为那时候数据早就渲染完了
  • 在 Filter 钩子里直接 echo,会破坏响应头或干脆输出到错误的位置
  • 同一个函数挂到多个钩子上,结果同一个位置被插了两次

判断口诀

要改数据用 Filter,要加显示用 Include。拿不准的时候看钩子名:带 Core_Save、Validate、Begin 的多半能改数据;带 LeftMenu、Footer、Top 的多半只是插内容。