织梦cms栏目标签筛选

栏目标签筛选概述

织梦CMS的标签筛选功能允许用户通过点击TAG标签来筛选栏目内的文章。虽然织梦CMS没有内置的标签筛选页面,但可以通过TAG系统和自定义开发来实现按标签筛选栏目内容的功能。

一、栏目页侧边栏标签云

<!-- 栏目侧边栏:显示该栏目文章的TAG标签 -->
<div class="side-box tag-box">
  <h3>相关标签</h3>
  <div class="tag-cloud">
    {dede:sql sql="SELECT DISTINCT t.tag, t.tid, COUNT(*) as cnt 
    FROM dede_taglist tl
    INNER JOIN dede_archives a ON tl.aid=a.id
    INNER JOIN dede_tagindex t ON tl.tid=t.id
    WHERE a.typeid={dede:field.id/}
    GROUP BY t.tag ORDER BY cnt DESC LIMIT 30"}
    <a href="/tags.php?/[field:tag/]" 
       style="font-size:[field:cnt runphp='yes']@me=12+@me*3;[/field:cnt]px">
      [field:tag/]
    </a>
    {/dede:sql}
  </div>
</div>

二、栏目内按标签筛选的URL方案

<!-- 通过URL参数实现栏目+标签筛选 -->
<a href="/plus/list.php?tid={dede:field.id/}&tag=织梦">织梦</a>
<a href="/plus/list.php?tid={dede:field.id/}&tag=网站建设">网站建设</a>
<a href="/plus/list.php?tid={dede:field.id/}&tag=CMS">CMS</a>

三、标签筛选的PHP处理逻辑

<?php
// 在list.php或自定义页面中处理标签筛选
$typeid=isset($_GET['tid']) ? intval($_GET['tid']) : 0;
$tag=isset($_GET['tag']) ? addslashes($_GET['tag']) : '';

if(!empty($tag)){
    // 根据标签筛选栏目内的文章
    $sql="SELECT a.id,a.title,a.pubdate,tl.tid
            FROM dede_archives a
            INNER JOIN dede_taglist tl ON a.id=tl.aid
            INNER JOIN dede_tagindex ti ON tl.tid=ti.id
            WHERE a.typeid={$typeid}
            AND ti.tag='{$tag}'
            AND a.arcrank=0
            ORDER BY a.pubdate DESC";
    
    $dsql->SetQuery($sql);
    $dsql->Execute();
    
    echo "<h2>标签「{$tag}」下的文章</h2>";
    while($row=$dsql->GetArray()){
        echo '<li><a href="/plus/view.php?aid='.$row['id'].'">'.$row['title'].'</a></li>';
    }
}
?>

四、多标签交叉筛选

<?php
// 支持同时按多个标签筛选
$tags=isset($_GET['tags']) ? explode(',', $_GET['tags']) : [];

if(!empty($tags) && $typeid > 0){
    $tagConditions=[];
    foreach($tags as $tag){
        $tag=addslashes(trim($tag));
        $tagConditions[]="ti.tag='{$tag}'";
    }
    
    $sql="SELECT a.id,a.title,COUNT(DISTINCT tl.tid) as matched_tags
            FROM dede_archives a
            INNER JOIN dede_taglist tl ON a.id=tl.aid
            INNER JOIN dede_tagindex ti ON tl.tid=ti.id
            WHERE a.typeid={$typeid}
            AND a.arcrank=0
            AND (".implode(' OR ', $tagConditions).")
            GROUP BY a.id
            ORDER BY matched_tags DESC, a.pubdate DESC
            LIMIT 20";
}
?>

五、前端标签筛选交互

<!-- 标签筛选按钮组 -->
<div class="tag-filters">
  <span class="filter-label">筛选:</span>
  <a href="?tid={dede:field.id/}" class="active">全部</a>
  {dede:sql sql="SELECT DISTINCT t.tag FROM dede_taglist tl
  INNER JOIN dede_archives a ON tl.aid=a.id
  INNER JOIN dede_tagindex t ON tl.tid=t.id
  WHERE a.typeid={dede:field.id/} LIMIT 10"}
  <a href="?tid={dede:field.id/}&tag=[field:tag/]">
    [field:tag/]
  </a>
  {/dede:sql}
</div>

<!-- CSS样式 -->
<style>
.tag-filters a{
  display:inline-block;
  padding:6px 14px;
  margin:3px;
  border:1px solid #ddd;
  border-radius:20px;
  font-size:14px;
  text-decoration:none;
  color:#666;
  transition:.3s;
}
.tag-filters a.active,
.tag-filters a:hover{background:#3498db;color:#fff;border-color:#3498db;}
</style>
SEO优化:标签筛选页面应添加 noindex 标记来避免重复内容问题,或将筛选参数通过JavaScript异步加载而非生成独立URL。对于流量较大的标签筛选页,可考虑生成静态HTML页面以提升性能。