要修改提供的 Discuz! 代码(get_attach 函数),以便每个主题只获取一张图片,并支持获取外链图片,你可以进行以下调整: 修改附件的 foreach 循环: 不再针对每个主题($attachtableid_array)遍历所有附件,而是修改为仅获取第一个附件(使用 LIMIT 1)。这假设你希望每个主题仅获取一张附件。 支持外链图片: 添加逻辑来检查外链图片,除了论坛附件外,外链图片通常直接链接在帖子消息中。 下面是修改后的代码示例: [PHP] 纯文本查看 复制代码 function get_attach($list, $video = false, $audio = false){ global $_G; require_once libfile('function/post'); require_once libfile('function/discuzcode'); $tids = $threads = $attachtableid_array = $threadlist_data = $posttableids = array(); foreach($list as $value) { $tids[] = $value['tid']; if(!in_array($value['posttableid'], $posttableids)){ $posttableids[] = $value['posttableid']; } $threads[$value['tid']] = $value; } foreach ($posttableids as $id) { $posts = C::t('forum_post')->fetch_all_by_tid($id, $tids, true, '', 0, 0, 1, null, null, null); foreach($posts as $value) { if(!$_G['forum']['ismoderator'] && $value['status'] & 1) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_single_banned'); } elseif(strpos($value['message'], '[/password]') !== FALSE) { $threadlist_data[$value['tid']]['message'] = lang('forum/template', 'message_password_exists'); } elseif($threads[$value['tid']]['readperm'] > 0) { $value['message'] = ''; } else { if($threads[$value['tid']]['price'] > 0) { preg_match_all("/\[free\](.+?)\[\/free\]/is", $value['message'], $matches); $value['message'] = ''; if(!empty($matches[1])) { foreach($matches[1] as $match) { $value['message'] .= $match.' '; } } } // 检查视频和音频嵌入 if($value['message'] && ($video || $audio)){ $value['media'] = ''; $value['message'] = preg_replace(array("/\[hide=?\d*\](.*?)\[\/hide\]/is"), array(""), $value['message']); $value['msglower'] = strtolower($value['message']); if(strpos($value['msglower'], '[/media]') !== FALSE && $video) { preg_match("/\[media=([\w,]+)\]\s*([^\[\<\r\n]+?)\s*\[\/media\]/is", $value['message'], $value['video']); $threadlist_data[$value['tid']]['media'] = parsemedia($value['video'][1], $value['video'][2]); } elseif(strpos($value['msglower'], '[/audio]') !== FALSE && $audio) { preg_match("/\[audio(=1)*\]\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is", $value['message'], $value['audio']); $threadlist_data[$value['tid']]['media'] = parseaudio($value['audio'][2], 400); } } // 截取并存储消息摘要 $threadlist_data[$value['tid']]['message'] = messagecutstr($value['message'], 90); // 获取附件 if($threads[$value['tid']]['attachment'] == 2) { $attachtableid_array[getattachtableid($value['tid'])][] = $value['pid']; } // 如果启用外链图片,则添加逻辑 if($threads[$value['tid']]['attachment'] == 2) { $attachs = C::t('forum_attachment_n')->fetch_all_by_pid_width($tableid, $pids, $attachment, 0, 1); // 每个主题仅获取一个附件 foreach($attachs as $value){ $threadlist_data[$value['tid']]['attachment'][] = getforumimg($value['aid'], 0); } } elseif($external_images_enabled) { preg_match_all('/<img.+?src=[\'"]([^\'"]+)[\'"].*?>/i', $value['message'], $matches); if(!empty($matches[1])) { // 假设你希望获取帖子中找到的第一个图片 $threadlist_data[$value['tid']]['attachment'][] = $matches[1][0]; } } } } } return $threadlist_data; } 解释:- 附件获取:fetch_all_by_pid_width 函数现在包括了限制 (0, 1),以便每个主题仅获取一个附件。
- 外链图片:添加了一个检查 ($external_images_enabled) 来从帖子消息中获取外链图片。这使用正则表达式来查找 <img> 标签并提取 src 属性。
根据你的设置或偏好调整 $external_images_enabled,这些修改确保你每个主题仅获取一个附件,并且能够支持在论坛附件之外获取外链图片。 |