下面我将为您提供两种实现方法,一种是简单直接的,另一种是更完善、推荐的。

(图片来源网络,侵删)
简单直接法(修改PHP和模板)
这种方法的核心思路是:页的模板中,判断当前用户是否已评论过这篇文章,如果评论过就显示全部内容,否则只显示部分内容。
步骤 1:修改文章内容模板 (article_article.htm)
- 找到你的文章内容模板文件,通常位于
/templets/default/article_article.htm。 - 找到显示文章正文内容的地方,通常是一个
{dede:field.body/}- 用
{dede:php}标签将其包裹起来,并添加判断逻辑。 - 用
修改前的代码可能类似这样:
<div class="article-content">
{dede:field.body/}
</div>
修改后的代码如下:
<div class="article-content">
{dede:php}
// 获取当前文章ID
$aid = $arcID;
// 获取当前用户ID,如果是游客则为0
$uid = $cfg_ml->M_ID; // 需要在模板头部引入 {dede:include filename='head.htm'/} 以便加载会员类
// 查询数据库,检查该用户是否评论过此文章
$dsql->SetQuery("SELECT * FROM `dede_feedback` WHERE `aid` = $aid AND `uid` = $uid AND `ischeck` = 1");
$dsql->Execute();
$hasCommented = $dsql->GetRows() > 0;
if ($hasCommented) {
// 如果评论过,则显示全部内容
echo $fields['body'];
} else {
// 如果没评论过,则只显示前200个字符作为示例
// 注意:这里直接截取 $fields['body'] 可能会破坏HTML结构,更安全的方法是使用正则表达式或专门的截取函数。
// 这里为了简单,直接使用 mb_substr,并假设内容是安全的。
$shortContent = mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8');
echo $shortContent . '...<br/><br/>';
// 显示提示信息和评论表单
echo '<div style="border:1px dashed #ccc; padding:10px; background:#f9f9f9; text-align:center; color:#666;">';
echo '评论本文后即可查看完整内容!';
// 这里可以手动嵌入评论表单,或者引导用户到评论区
echo '<a href="#comment" style="color:#0066cc;">前往评论</a>';
echo '</div>';
}
{/dede:php}
</div>
<!-- 原有的评论表单保持不变 -->
<div id="comment">
<!-- 你的评论表单代码... -->
</div>
代码解释:

(图片来源网络,侵删)
$aid = $arcID;: 获取当前文章的ID。$uid = $cfg_ml->M_ID;: 获取当前登录用户的ID,如果用户未登录,$cfg_ml->M_ID的值会是0。注意: 这行代码依赖于{dede:include filename='head.htm'/}加载的会员环境。dsql->SetQuery(...): 查询dede_feedback(评论) 表,检查是否存在指定用户 (uid) 对指定文章 (aid) 且已审核 (ischeck=1) 的评论。$hasCommented = $dsql->GetRows() > 0;: 如果查询结果大于0条记录,说明用户评论过。echo $fields['body'];: 如果评论过,输出完整文章内容。mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8'): 如果没评论过,先去除HTML标签,然后截取前200个字符作为摘要。- 显示一个提示信息,并引导用户去评论。
更完善、推荐的方法(使用自定义模型字段)
这种方法更灵活,也更容易管理,它不直接修改模板逻辑,而是通过一个“开关”字段来控制内容是否可见。
步骤 1:修改数据库表结构
-
登录你的phpMyAdmin,找到织梦数据库。
-
找到文章内容主表,通常是
dede_archives。 -
为
dede_archives表添加一个新的字段,need_comment。
(图片来源网络,侵删)ALTER TABLE `dede_archives` ADD `need_comment` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否需要评论后可见,0=否,1=是';
步骤 2:修改后台发布文章界面
-
找到织梦后台的文件管理器,进入
/dede/目录。 -
找到并编辑文章编辑模板,通常是
article_edit.htm。 -
在你希望显示“评论后可见”选项的地方(比如在文章摘要、来源等字段的后面),添加以下代码:
<tr> <td height="24" colspan="2" style="background:#f5f5f5;"> <b>评论后可见设置:</b> </td> </tr> <tr> <td class="bline" width="120">开启评论后可见:</td> <td class="bline"> <input type="radio" name="need_comment" value="0" checked="checked" /> 否 <input type="radio" name="need_comment" value="1" /> 是 </td> </tr> -
修改文章内容保存脚本
article_edit.php,让它接收并保存这个新字段。 在文件中找到//更新附加表的部分(通常在第600行左右),在$upquery = "UPDATEdede_archivesSET..."这句SQL语句中,添加need_comment字段:// 找到类似这样的代码 $upquery = "UPDATE `dede_archives` SET `typeid`='$typeid', `title`='$title', `ismake`='$ismake', `litpic`='$litpic', `pubdate`='$pubdate', `sortrank`='$sortrank', `mid`='$mid', `click`='$click', `money`='$money', `description`='$description', `keywords`='$keywords', `templet`='$templet', `senddate`='$senddate' WHERE id='$id'"; // 修改为 $need_comment = isset($need_comment) && $need_comment == '1' ? 1 : 0; $upquery = "UPDATE `dede_archives` SET `typeid`='$typeid', `title`='$title', `ismake`='$ismake', `litpic`='$litpic', `pubdate`='$pubdate', `sortrank`='$sortrank', `mid`='$mid', `click`='$click', `money`='$money', `description`='$description', `keywords`='$keywords', `templet`='$templet', `senddate`='$senddate', `need_comment`='$need_comment' // 添加这一行 WHERE id='$id'";
步骤 3:修改文章内容模板 (article_article.htm)
模板的逻辑就变得非常清晰了。
<div class="article-content">
{dede:php}
// 获取当前文章ID
$aid = $arcID;
// 获取当前用户ID,如果是游客则为0
$uid = $cfg_ml->M_ID;
// 1. 首先检查文章是否设置了“评论后可见”
$dsql->SetQuery("SELECT `need_comment` FROM `dede_archives` WHERE `id` = $aid");
$dsql->Execute('need_comment');
$row = $dsql->GetArray('need_comment');
$needComment = $row['need_comment'];
if ($needComment == 1) {
// 2. 如果设置了,再检查用户是否评论过
$dsql->SetQuery("SELECT * FROM `dede_feedback` WHERE `aid` = $aid AND `uid` = $uid AND `ischeck` = 1");
$dsql->Execute();
$hasCommented = $dsql->GetRows() > 0;
if ($hasCommented) {
// 评论过,显示全文
echo $fields['body'];
} else {
// 没评论过,显示摘要
$shortContent = mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8');
echo $shortContent . '...<br/><br/>';
echo '<div style="border:1px dashed #ccc; padding:10px; background:#f9f9f9; text-align:center; color:#666;">';
echo '本文开启了“评论后可见”,评论本文后即可查看完整内容!';
echo '<a href="#comment" style="color:#0066cc;">前往评论</a>';
echo '</div>';
}
} else {
// 3. 如果文章没设置,直接显示全文
echo $fields['body'];
}
{/dede:php}
</div>
<!-- 原有的评论表单保持不变 -->
<div id="comment">
<!-- 你的评论表单代码... -->
</div>
总结与建议
| 特性 | 方法一 (简单直接) | 方法二 (自定义字段) |
|---|---|---|
| 实现难度 | 简单 | 中等,需要修改数据库和后台 |
| 灵活性 | 低,所有文章都使用同一套规则 | 高,可以为每篇文章单独设置 |
| 可维护性 | 差,逻辑写在模板里,不易修改 | 好,逻辑清晰,后台可配置 |
| 推荐度 | ⭐⭐ (适合临时或少量文章) | ⭐⭐⭐⭐⭐ (强烈推荐,专业做法) |
强烈建议您使用方法二,虽然前期步骤多一些,但它为你的网站提供了极大的灵活性和可扩展性,管理员可以在后台自由决定哪些文章需要评论后可见,哪些不需要,而无需修改任何代码。
重要提示:
- 修改文件前务必备份! 无论是模板文件还是PHP文件,修改前都请做好备份,以防出错。
- 测试: 修改完成后,务必在不同场景下进行测试,包括:已登录用户评论、已登录用户未评论、游客评论、游客未评论、以及未开启“评论后可见”的文章。
- HTML标签问题: 方法一中的
strip_tags和mb_substr简单粗暴,可能会破坏HTML结构,如果文章内容包含复杂的标签(如<table>),截断后可能导致页面错乱,更安全的做法是使用专门处理HTML截取的函数,但这会增加代码复杂度,对于大多数纯文本或简单格式的文章,方法一已经足够。
