Z-Blog 保存文章,Core 和 Succeed 别挂反

· zblog · 阅读 13
摘要

我上次给保存文章加了个小动作,挂在 Filter_Plugin_PostArticle_Succeed 上改字段。后台提示保存成功,刷新一看,字段还是旧的。不是钩子没跑,是我挂晚了。 这两个钩子名字很像,干的事差一截。 Core 还没写进数

我上次给保存文章加了个小动作,挂在 Filter_Plugin_PostArticle_Succeed 上改字段。后台提示保存成功,刷新一看,字段还是旧的。不是钩子没跑,是我挂晚了。

这两个钩子名字很像,干的事差一截。

Core 还没写进数据库

位置在 zb_system/function/c_system_event.php 的 PostArticle()。文章对象填完、类型定成文章、更新时间也写上之后,先跑 Core:

foreach ($GLOBALS['hooks']['Filter_Plugin_PostArticle_Core'] as $fpname => &$fpsignal) {
    $fpname($article);
}

FilterPost($article);
$article->Save();

所以在 Core 里改 $article,后面的 Save() 还能带上。我现在要补默认摘要、拦住空标题,都放这里。

有个顺序挺容易忽略:Core 之后还有一次 FilterPost($article)。你刚改完的内容,仍可能被后面这步再处理一遍。别以为出了 Core 就定稿了。

Succeed 是存完才通知你

保存、标签计数、分类计数都走完,才到 Succeed:

foreach ($GLOBALS['hooks']['Filter_Plugin_PostArticle_Succeed'] as $fpname => &$fpsignal) {
    $fpname($article);
}

return $article;

这时候库里那一行已经写进去了。你在这个钩子里继续改 $article->Title,只是改了内存里的对象,不会自动再存一次。我之前就栽在这。

它适合做保存后的事。记一条日志,通知别的服务,或者像本站百度推送那样拿已经生成的地址去提交。文章 ID 也肯定有了,新建时不用再猜。

我现在的挂法

要影响最终保存结果,挂 Core。只是知道“这篇文章存好了”,挂 Succeed。

// zb_users/plugin/你的插件/include.php
Add_Filter_Plugin('Filter_Plugin_PostArticle_Core', 'MyPlugin_BeforeSave');
Add_Filter_Plugin('Filter_Plugin_PostArticle_Succeed', 'MyPlugin_AfterSave');

function MyPlugin_BeforeSave($article) {
    if (trim($article->Title) === '') {
        $article->Title = '未命名';
    }
}

function MyPlugin_AfterSave($article) {
    // 这里改标题不会写回数据库
}

页面走的是另一套,PostPage() 里对应 Filter_Plugin_PostPage_Core 和 Filter_Plugin_PostPage_Succeed。别把页面的保存也指望文章这两个钩子,我没在这次调用链里看到它会顺手触发。