下面我将为你提供几种方法,从最简单、最推荐的方法到更深入的修改方法,并解释其原理。
使用织梦内置的 GetTags 函数(最推荐)
这是最简单、最安全且官方推荐的方法,它利用了织梦的缓存机制,性能最好,这个函数专门用于获取一个文档或频道相关的标签列表,并可以附带文章数量。
适用场景: 在列表页(如栏目页、首页、搜索页等)的循环中,为每篇文章显示它所包含的标签及其数量。
操作步骤:
-
找到你需要显示标签数量的模板文件。
- 首页模板:
/templets/default/index.htm - 栏目列表页:
/templets/default/list_article.htm - 页:
/templets/default/article_article.htm
- 首页模板:
-
在文章循环标签
{dede:arclist}内部,使用{dede:tag}标签来调用。 -
核心代码:
{dede:arclist titlelen='30' row='10'} <h3><a href="[field:arcurl/]">[field:title/]</a></h3> <p>[field:description function='cn_substr(@me,100)'/]...</p> <!-- 在这里添加标签和数量显示 --> <div class="tags"> 标签: {dede:tag sort='hot' getall='0'} <a href="[field:tagurl/]">[field:tagname/]([field:total/])</a> {/dede:tag} </div> <hr /> {/dede:arclist}
代码解释:
{dede:arilogyist}: 这是织梦的文章列表循环标签。{dede:tag}: 这是嵌套在arclist内部的标签调用标签。sort='hot': 可选参数,表示按标签热度排序,你也可以使用sort='count'按文章数量排序。getall='0': 可选参数,表示只获取当前文章的标签,设为1则会获取所有标签,通常不推荐。[field:tagurl/]: 标签的链接地址。[field:tagname/]: 标签的名称。[field:total/]: 这就是关键! 这个字段会自动显示当前标签关联的文章数量。
效果示例:
如果一篇文章被标记了 "织梦CMS" 和 "网页制作","织梦CMS" 这个标签下共有50篇文章,"网页制作" 下有20篇,那么显示效果就会是:
标签:<a href="/tags.php?/织梦CMS/">织梦CMS(50)</a><a href="/tags.php?/网页制作/">网页制作(20)</a>
在标签列表页显示每个标签的文章数量
这个场景是:你有一个专门的标签聚合页(通常是 tags.php),你想在这个页面上列出所有标签,并且每个标签后面都跟它对应的文章总数。
适用场景: 自定义的标签云页面或标签列表页。
操作步骤:
-
找到标签列表模板文件,通常位于
/templets/default/taglist.htm。 -
在
{dede:tag}循环中使用total字段。 -
核心代码:
<h2>所有标签</h2> <div class="tag-cloud"> {dede:tag sort='count' row='100' getall='1'} <a href="[field:tagurl/]" title="[field:total/]篇文章"> [field:tagname/] <span class="count">([field:total/])</span> </a> {/dede:tag} </div>
代码解释:
{dede:tag}: 直接使用标签循环,不嵌套在arclist里。sort='count': 非常重要,这里按文章数量 (count) 排序,让热门标签排在前面。row='100': 设置显示的标签数量,0或不设置表示显示全部。getall='1': 非常重要,表示获取系统中的所有标签。[field:total/]: 同样是显示每个标签对应的文章总数。
CSS样式建议: 为了让标签云更美观,你可以添加一些CSS来控制不同数量标签的样式。
.tag-cloud a {
display: inline-block;
margin: 5px;
padding: 3px 8px;
background-color: #f0f0f0;
border-radius: 3px;
text-decoration: none;
color: #333;
}
/* 文章数量越多的标签,字体越大、颜色越深 */
.tag-cloud a span.count {
font-size: 0.8em;
color: #777;
margin-left: 3px;
}
/* 可以通过JS或更复杂的CSS来实现动态样式,这里简单举例 */
修改PHP文件(不推荐,仅作了解)
如果你想在非文章循环的地方(比如自定义的页面模块)也显示标签数量,GetTags 函数无法满足需求,你可能需要直接修改PHP文件。这会破坏织梦的封装性,升级时可能被覆盖,请谨慎操作。
原理:
织梦标签的底层逻辑在 /include/helpers/archive.helper.php 文件中的 GetTags() 函数里,你可以修改这个函数,让它默认返回包含数量的数据。
操作步骤(高风险):
-
备份你的网站和
/include/helpers/archive.helper.php文件。 -
打开
/include/helpers/archive.helper.php文件。 -
找到
GetTags()函数(大约在第580行)。 -
修改SQL查询语句,让它
COUNT文章数量。原始代码片段可能类似这样:
$query = "SELECT tag FROM `dede_taglist` WHERE aid='$aid' "; // ... $tags = ''; while($row = $dsql->GetArray($this->dsql->SetQuery($query))) { $tags .= ($tags=='' ? $row['tag'] : ','.$row['tag']); } return $tags;修改后(思路示意): 你需要将这个函数重写或修改,使其
JOINdede_tag表来获取count字段,这非常复杂,且容易出错。
更安全的“伪修改”方法: 创建一个自定义函数,然后在模板里调用。
-
在
/include/extend.func.php文件(如果没有就创建一个)中加入以下函数:/** * 获取指定标签的文章数量 * @param string $tagname 标签名 * @return int */ function getTagCount($tagname) { global $dsql; $tagname = addslashes($tagname); $row = $dsql->GetOne("SELECT count FROM `dede_tag` WHERE tag like '{$tagname}'"); return isset($row['count']) ? $row['count'] : 0; } -
在你的模板文件中,可以直接调用这个函数:
{dede:tag sort='hot' row='10'} 标签: [field:tagname/] - 数量: {dede:field name='tagname' function="getTagCount(@me)"/} {/dede:tag}注意: 这种方法在循环中调用PHP函数,性能不如方法一,因为它无法利用缓存,仅在特殊情况下使用。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 方法一 | 简单、安全、高效、利用缓存 | 只能在 arclist 循环内使用 |
⭐⭐⭐⭐⭐ (首选) |
| 方法二 | 官方标准做法,适合标签列表页 | 需要在特定模板文件中操作 | ⭐⭐⭐⭐⭐ (用于标签云页) |
| 方法三 | 灵活性极高,可在任何地方调用 | 复杂、有风险、破坏封装、性能差 | ⭐☆☆☆☆ (不推荐,除非万不得已) |
对于绝大多数用户,方法一和方法二已经完全够用,请优先使用这两种方法,它们是织梦CMS设计的最佳实践。
