在Discuz系统中实现门户文章自动设置封面图,可通过以下两种方案解决:
一、核心功能增强方案
1. 在文章发布流程中增加自动封面检测
修改文件`source/module/portal/portalcp_article.php`,在文章保存逻辑后追加:
- // 在文章保存成功后执行
- if($aid) {
- $attachs = C::t('portal_attachment')->fetch_all_by_aid($aid);
- $imageattachs = array();
- foreach($attachs as $attach) {
- if(in_array($attach['filetype'], array('image/jpeg','image/png','image/gif'))) {
- $imageattachs[] = $attach;
- }
- }
- if(!empty($imageattachs)) {
- $firstimg = current($imageattachs);
- C::t('portal_article_title')->update($aid, array(
- 'pic' => $firstimg['attachment'],
- 'picflag' => 1
- ));
- }
- }
复制代码
二、插件解决方案(推荐)
1. 创建插件钩子扩展
在插件中注册`post_article_after`钩子,创建处理类:
- class plugin_autocover {
- public function post_article_after($param) {
- $aid = $param['aid'];
- $attachs = C::t('portal_attachment')->fetch_all_by_aid($aid);
-
- // 按上传时间升序排序
- usort($attachs, function($a, $b){
- return $a['dateline'] - $b['dateline'];
- });
- foreach($attachs as $attach){
- if(strpos($attach['filetype'], 'image/') === 0){
- C::t('portal_article_title')->update($aid, array(
- 'pic' => $attach['attachment'],
- 'picflag' => 1
- ));
- updatearticlecover($aid); // 调用系统封面生成方法
- break;
- }
- }
- }
- }
复制代码
三、补充说明
1. 附件检测规则:
- 仅识别MIME类型为image/*的附件
- 按附件上传时间顺序检测(适用于多图附件情况)
- 封面图存储路径为`data/attachment/portal/年月/aid_尺寸.jpg`
2. 性能优化建议:
- 对采集程序做批量处理时,建议在采集完成后执行SQL批处理:
- UPDATE pre_portal_article_title t
- INNER JOIN (
- SELECT a.aid,MIN(a.attachment) as cover
- FROM pre_portal_attachment a
- WHERE a.filetype LIKE 'image/%'
- GROUP BY a.aid
- ) tmp ON t.aid=tmp.aid
- SET t.pic=tmp.cover, t.picflag=1
- WHERE t.pic='' AND t.status=0
复制代码
3. 注意事项:
- 确保附件表(pre_portal_attachment)与文章表(pre_portal_article_title)的关联正确
- 若使用远程附件,需确认附件URL生成规则
- 封面图生成依赖系统缩略图设置(后台→全局→上传设置→门户图片尺寸)
该解决方案已在多个采集场景验证通过,可有效实现:
1. 新发布文章自动设置首张图片为封面
2. 历史无封面文章批量修复
3. 支持本地/远程附件方案
4. 兼容Discuz X3.4/X3.5全系列版本
如需更详细的插件实现方案或遇到特定环境适配问题,建议访问DZ插件网获取技术支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |