在Discuz!中,删除帖子时,默认情况下只会删除与帖子直接相关的附件和图片,而不会自动删除缩略图或其他生成的图片。这是因为Discuz!的图片处理机制会将上传的图片生成不同尺寸的缩略图,并存储在不同的目录中。
### 问题分析
1. **/data/attachment/forum/202409/02**:这是帖子附件图片的存储目录,删除帖子时会自动清理。
2. **/data/attachment/forum/threadcover/c8/1e**:这是帖子封面图片的存储目录,删除帖子时也会自动清理。
3. **/data/attachment/image/000/00/00**:这是缩略图的存储目录,删除帖子时不会自动清理。
### 解决方案
为了在删除帖子时彻底清理所有相关的图片(包括缩略图),你可以通过以下方式实现:
#### 1. 修改删除帖子的逻辑
你可以在删除帖子的逻辑中添加自定义代码,手动清理缩略图目录中的图片。以下是一个示例代码:
- // 假设你已经获取了帖子的ID
- $tid = 123;
- // 获取帖子中的图片附件
- $attachments = C::t('forum_attachment')->fetch_all_by_tid('image', $tid);
- foreach ($attachments as $attachment) {
- // 删除原始图片
- $filepath = DISCUZ_ROOT . $attachment['attachment'];
- if (file_exists($filepath)) {
- @unlink($filepath);
- }
- // 删除缩略图
- $thumbpath = DISCUZ_ROOT . '/data/attachment/image/' . substr($attachment['attachment'], 0, 3) . '/' . substr($attachment['attachment'], 3, 2) . '/' . substr($attachment['attachment'], 5, 2) . '/' . basename($attachment['attachment']);
- if (file_exists($thumbpath)) {
- @unlink($thumbpath);
- }
- }
- // 继续执行Discuz!默认的删除帖子逻辑
- C::t('forum_thread')->delete_by_tid($tid);
复制代码
#### 2. 使用插件扩展功能
如果你不想直接修改Discuz!的核心代码,可以通过开发一个插件来实现这个功能。插件可以通过钩子(hook)在删除帖子时触发自定义的清理逻辑。
##### 插件开发步骤:
1. **创建插件**:在DZ插件网(https://www.dz-x.net/)下载插件开发模板,或者手动创建一个插件目录。
2. **添加钩子**:在插件的`hook`目录下创建一个PHP文件,例如`hook_delete_thread.php`,并在其中添加以下代码:
- if (!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class plugin_yourpluginname_hook_delete_thread {
- public function delete_thread($param) {
- global $_G;
- $tid = $param['tid'];
- // 获取帖子中的图片附件
- $attachments = C::t('forum_attachment')->fetch_all_by_tid('image', $tid);
- foreach ($attachments as $attachment) {
- // 删除原始图片
- $filepath = DISCUZ_ROOT . $attachment['attachment'];
- if (file_exists($filepath)) {
- @unlink($filepath);
- }
- // 删除缩略图
- $thumbpath = DISCUZ_ROOT . '/data/attachment/image/' . substr($attachment['attachment'], 0, 3) . '/' . substr($attachment['attachment'], 3, 2) . '/' . substr($attachment['attachment'], 5, 2) . '/' . basename($attachment['attachment']);
- if (file_exists($thumbpath)) {
- @unlink($thumbpath);
- }
- }
- }
- }
复制代码
3. **注册钩子**:在插件的`plugin_yourpluginname.class.php`文件中注册钩子:
- class plugin_yourpluginname extends discuz_plugin {
- public function __construct() {
- parent::__construct();
- }
- public function common() {
- global $_G;
- // 注册删除帖子时的钩子
- $this->hook('delete_thread', 'plugin_yourpluginname_hook_delete_thread::delete_thread');
- }
- }
复制代码
4. **安装插件**:将插件上传到`source/plugin/`目录,并在后台安装启用。
### 总结
通过修改删除帖子的逻辑或开发插件,你可以在删除帖子时自动清理所有相关的图片,包括缩略图。这样可以有效减少服务器上的冗余文件,节省存储空间。如果你对插件开发不熟悉,可以参考DZ插件网(https://www.dz-x.net/)上的相关教程和文档。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |