文章地址自定义接口
在 Z-BlogPHP 中,文章对象的 Url 是一个虚拟属性,每次读取 $post->Url(包括模板中的 {$article.Url})时都会触发 Filter_Plugin_Post_Url 接口,可以借此接管文章地址的生成逻辑,实现自定义链接、站外跳转地址等场景。
接口信息
| 接口 | 参数 | 说明 |
|---|---|---|
Filter_Plugin_Post_Url | &$this | 干预 Post 类 Url 方法的接口 |
完整案例
下例只为设置了 demo_custom_url 元数据(Metas)的文章返回自定义地址,其余文章仍走系统默认的路由规则生成地址:
php
<?php
RegisterPlugin("demoAPP", "ActivePlugin_demoAPP");
function ActivePlugin_demoAPP()
{
Add_Filter_Plugin('Filter_Plugin_Post_Url', 'demoAPP_Post_Url');
}
function demoAPP_Post_Url(&$post)
{
global $zbp;
$custom = isset($post->Metas->demo_custom_url) ? $post->Metas->demo_custom_url : '';
if ($custom != '') {
// 动态设置 RETURN 信号,本次读取 Url 时使用本回调的返回值
SetPluginSignal('Filter_Plugin_Post_Url', __FUNCTION__, PLUGIN_EXITSIGNAL_RETURN);
return $zbp->host . 'goto/?url=' . rawurlencode($custom);
}
}注意事项
- 仅在读取
Url属性时触发;Url是只读虚拟属性,直接给$post->Url赋值不会触发本接口(赋值会被系统忽略)。 - 注册时第三个参数传
PLUGIN_EXITSIGNAL_RETURN表示无条件使用回调返回值,所有文章的 Url 都会被接管;本例使用SetPluginSignal按需生效,未设置自定义地址的文章继续由系统按路由规则生成地址。 - 回调中不要再次读取当前文章的
Url属性(例如拼接列表),否则会再次触发本接口造成死循环。 - 返回的自定义地址需要配合伪静态规则或自行保证可访问,否则前台点击会得到 404。