通用文章删除前归档扩展
通过 Filter_Plugin_DelPost_Core 接口,可以在 Z-BlogPHP 删除任意 Post 类对象之前拿到完整对象数据。该接口在 DelPost() 函数内触发,此时权限检查已通过、对象仍完整存在于数据库中,是删除前做备份或审计的最后一道关卡,为 1.7.0 加入的通用入口。
接口信息
| 接口 | 参数 | 说明 |
|---|---|---|
Filter_Plugin_DelPost_Core | &$post | Post 类对象的通用删除核心接口(1.7.0 加入) |
完整案例
下例在删除前把 Post 对象的完整数据连同操作人、删除时间归档为一个 JSON 文件,留作审计凭证:
php
<?php
RegisterPlugin("demoAPP", "ActivePlugin_demoAPP");
function ActivePlugin_demoAPP()
{
Add_Filter_Plugin('Filter_Plugin_DelPost_Core', 'demoAPP_DelPost_Core');
}
function demoAPP_DelPost_Core(&$post)
{
// 删除前归档完整对象数据
$data = array(
'id' => $post->ID,
'type' => $post->Type,
'title' => $post->Title,
'author_id' => $post->AuthorID,
'content' => $post->Content,
'deleted_by' => $GLOBALS['zbp']->user->Name,
'deleted_time' => date('Y-m-d H:i:s'),
);
$dir = $GLOBALS['zbp']->usersdir . 'plugin/demoAPP/archive/';
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
file_put_contents($dir . 'post-' . $post->ID . '.json', json_encode($data, JSON_UNESCAPED_UNICODE));
}注意事项
- 触发位置:在
DelPost()中、权限检查通过之后、$post->Del()之前,此时对象数据仍完整,适合做删除前备份;接口执行完才会真正删除数据; - 参数按引用传递,回调函数签名必须写成
&$post;在本接口中修改对象属性没有实际意义,即将删除的数据以触发时的状态为准; - 本接口与
Filter_Plugin_DelPost_Succeed是同一删除流程的前后两段:Core 在删除动作前触发,Succeed 在删除及相关计数清理完成后触发; - 只有走通用
DelPost()的删除流程才会触发本接口;文章、页面的专用删除函数DelArticle()、DelPage()没有对应的 Del Core 接口,只提供Filter_Plugin_DelArticle_Succeed、Filter_Plugin_DelPage_Succeed删除后接口; - 若
Post对象的 ID 不存在($post->ID为 0),整个删除流程会直接跳过,本接口不会触发。