在织梦(DedeCMS)系统中,调用相同标签(tag)的文章是一个常见需求,特别是在实现相关文章、热门标签聚合等功能时,本文将详细介绍通过多种方法实现这一目标,包括系统自带标签调用、自定义SQL查询以及结合缓存优化性能等操作步骤,并辅以代码示例和注意事项说明。

使用系统自带标签调用相同tag文章
织梦系统提供了{dede:tag}
标签和{dede:arclist}
标签的组合调用功能,无需修改代码即可实现基础需求,具体操作步骤如下:
-
获取当前页面的tag标签
在文章内容页(article_article.htm)或列表页,先通过{dede:tag}
标签获取当前文章的所有标签,{dede:tag sort='hot' getall='0'} <a href='[field:link/]'>[field:tagname/]</a> {/dede:tag}
其中
getall='0'
表示仅调用当前文章的标签。 -
组合arclist标签调用相关文章
在需要显示相关文章的位置,使用以下代码:(图片来源网络,侵删){dede:arclist titlelen='30' row='10'} [field:title/] {/dede:arclist}
关键点在于
typeid
和tagid
参数的配合,若需精确匹配当前标签,需通过PHP获取当前标签ID并传递给arclist
,具体实现方法可参考下文自定义SQL部分。
通过自定义SQL实现精准调用
当系统自带标签无法满足复杂需求时,可直接编写SQL查询数据库,以下是具体实现方案:
-
创建自定义函数
在include/common.func.php
文件中添加以下函数:function GetSameTagArc($tagid, $row=10, $typeid=0) { global $dsql; $tags = ''; $query = "SELECT aid FROM `dede_taglist` WHERE tagid='$tagid' $typeid AND id<>'$typeid' LIMIT $row"; $dsql->Execute('me',$query); while($row = $dsql->GetArray('me')) { $tags .= GetOneArchive($row['aid']).','; } return $tags ? substr($tags,0,-1) : ''; }
函数参数说明:
$tagid
为标签ID,$row
返回文章数量,$typeid
可指定栏目ID。(图片来源网络,侵删) -
在模板中调用
在模板文件中使用:{dede:php} $tagid = GetTagID(); // 需自定义获取当前标签ID的方法 $sameArc = GetSameTagArc($tagid, 5); $dsql->SetQuery("SELECT title,id FROM `dede_archives` WHERE id IN ($sameArc)"); $dsql->Execute(); while($arr = $dsql->GetArray()){ echo "<a href='/plus/view.php?aid=".$arr['id']."'>".$arr['title']."</a>"; } {/dede:php}
结合缓存优化性能
当标签文章数量较大时,频繁查询数据库会影响网站速度,可通过以下方式优化:
-
使用缓存机制
修改自定义函数,添加缓存逻辑:function GetSameTagArcCache($tagid, $row=10) { $cacheFile = dirname(__FILE__).'/cache/sametag_'.$tagid.'.cache'; if(file_exists($cacheFile) && filemtime($cacheFile) > (time()-3600)) { return file_get_contents($cacheFile); } $content = GetSameTagArc($tagid, $row); // 调用原函数 file_put_contents($cacheFile, $content); return $content; }
-
定时更新缓存
通过织梦的计划任务功能,设置每小时执行一次缓存更新脚本,避免实时生成的性能损耗。
常见问题与解决方案
问题现象 | 可能原因 | 解决方法 |
---|---|---|
调用结果为空 | 标签ID获取错误 | 检查$tagid 变量是否正确传递,可使用var_dump() 调试 |
文章重复显示 | SQL查询未去重 | 在SQL语句中添加GROUP BY id 条件 |
页面加载缓慢 | 未使用缓存 | 按本文第三部分实现缓存机制 |
相关问答FAQs
问题1:如何排除当前文章,只显示其他相同标签的文章?
解答:在自定义SQL查询中添加AND aid<>'$arcid'
条件,其中$arcid
为当前文章ID,例如修改GetSameTagArc
函数中的查询语句为:
$query = "SELECT aid FROM
dede_taglistWHERE tagid='$tagid' AND aid<>'$arcid' LIMIT $row";
问题2:能否按标签热度排序调用相关文章?
解答:可以通过修改SQL查询,关联dede_tagindex
表获取标签热度数据。
$query = "SELECT t.aid FROM
dede_taglistt LEFT JOIN
dede_tagindexi ON t.tagid=i.id WHERE t.tagid='$tagid' ORDER BY i.weekcount DESC LIMIT $row";
这样会优先显示热度更高的标签相关文章。