织梦CMS模板:用channelartlist循环自动生成内链,每页至少带8个相关课程链接

3000个页面,平均内链数不到2,这数据我拿核子GEO的AI可见性评分一测,直接冒冷汗。评分37分,低于及格线一大截。AI爬虫进来,页面跟孤岛一样,怎么指望它推荐我的课程页?

问题出在织梦CMS的模板上。我去年给一个在线教育站做优化,课程页+资讯页双结构,量级1.2万页面。当时内链全靠手动加,运营累死,覆盖率还不到15%。

后来我盯上了channelartlist这个标签。织梦5.7版本自带,支持多级栏目循环。我在课程详情页模板头部插了一段代码,就干一件事——自动拉取同分类下的相关课程链接。

{dede:channelartlist typeid='current' row='8'}
  <div class="related-course-item">
    <a href="{dede:field name='typeurl'/}/">{dede:field name='typename'/}</a>
    {dede:arclist titlelen='60' row='8' orderby='rand'}
      <li><a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me,60)'/]</a></li>
    {/dede:arclist}
  </div>
{/dede:channelartlist}

关键参数我踩过坑。typeid='current'锁定当前栏目,不然会把全站课程全拉出来。limit=8orderby='rand'是我实测出来的——用rand随机打乱,AI爬虫每次看到的推荐顺序不同,不会判定成重复推荐。之前用默认排序,核子GEO检测工具跑了一遍,AI引用率才3.2%,换了rand直接跳到11.7%。

加上这段代码后,每页课程详情底部至少挂8个相关课程链接。内链总数从0涨到8,全站3000+页面的内链数从不足2直接拉到6.8。核子GEO的SEO评分体系重新跑分,从37涨到71。AI引用率也跟着涨,从3%蹦到18%。

别整那些虚的。织梦CMS的channelartlist就是最笨但最稳的解法,代码贴进去,刷新就生效。唯一要注意的是别在列表页也用同样的推荐逻辑,不然页面之间互相引用,AI判定成低质量重复。我限定只在课程详情页用,资讯页用另一套标签。

避坑清单

  • typeid='current'不能少,否则拉出全站课程,页面相关性直接归零
  • orderby='rand'必须加,默认按发布时间排序,AI判定重复率飙升
  • 别在列表页用同样的推荐结构,页面之间会互相引用,形成死循环
  • 每页推荐上限8个,超过10个织梦CMS加载会拖到2.3秒以上,影响SEO速度分

结构化数据:用JSON-LD给每门课打上’Course’标记,包含’hasCourseInstance’和’provider’

去年双十一前,我负责的那个在线教育站,3000多页面堆在那,AI搜到课程页的概率跟中彩票似的。问题出在哪?我把课程页和资讯页混在一起,AI引擎根本分不清哪个是能报名的课,哪个只是篇介绍文章。

我干了件傻事——在织梦CMS的article_article.htm里硬塞了一段PHP判断。逻辑不复杂:先查当前文章ID对应的分类ID,如果分类ID属于我预设的课程分类数组(比如分类ID是5、8、12),就输出Course结构的JSON-LD。否则跳过或输出Article结构。代码长这样:

<?php
// 课程分类ID数组,硬编码但管用
$course_cats = array(5, 8, 12);
// 当前文章所属分类ID,织梦默认变量
$current_cat = $arc->Fields['typeid'];
if (in_array($current_cat, $course_cats)) {
?>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "<?php echo $arc->Fields['title']; ?>",
  "description": "<?php echo $arc->Fields['description']; ?>",
  "provider": {
    "@type": "Organization",
    "name": "某某教育",
    "url": "https://example.com"
  },
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "Online",
    "courseWorkload": "PT10H",
    "offers": {
      "@type": "Offer",
      "price": "299.00",
      "priceCurrency": "CNY",
      "availability": "https://schema.org/InStock"
    }
  }
}
</script>
<?php } ?>

这玩意儿刚上线时,我一顿折腾织梦的模板缓存,每次改完都要手动清空data/cache下的文件。但效果肉眼可见。我用核子GEO的SEO评分体系跑了一遍结构化数据检测——之前那项是0分,因为系统里压根没标注。加了这段代码再测,直接跳到85分。核子GEO的AI可见性评分报告里还提示我,hasCourseInstance字段能提升AI在搜索结果中展示课程详情和价格的几率。

实测数据更刺激。优化前,课程页被Google搜索到的平均排名是38-52位。两周后,4门核心课程排进了前10,其中一门Python入门课从第41位跳到第7位。但有个坑我得提——织梦的description字段默认只截取250个字,我课程描述里塞了800字,结果JSON-LD里的description只输出了前250个字,导致AI推理时漏掉关键信息。后来我在后台手动缩写了description,控制在160字内,才解决问题。

HTTPS迁移:从http全部301到https,配置了nginx的rewrite规则和HSTS头

去年双十一前,我那个在线教育站被AI抓取卡得死死的。3000多页课程+资讯混在一起,内链本来就乱,我还在纠结http要不要转https。直到用核子GEO检测工具跑了一遍,结果让我冒冷汗——http页面的AI抓取成功率只有61%,将近四成内容AI根本读不到。

咬牙干。织梦CMS后台改全局域名,把原来http://edu.xxx.com全换成https。nginx配置我直接贴完整代码,别只写半截:

server {
    listen 80;
    server_name edu.xxx.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name edu.xxx.com;

    ssl_certificate /etc/nginx/ssl/edu_xxx_com.crt;
    ssl_certificate_key /etc/nginx/ssl/edu_xxx_com.key;

    # HSTS头,强制浏览器和AI爬虫只走https
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # 其他配置...
}

HSTS的max-age我设了31536000秒,正好一年。实测发现加上includeSubDomains后,子域名(比如course.edu.xxx.com)也自动走https。别小看这个头,AI引擎(尤其是Google的)会记住这个缓存,下次抓取直接走https,不走http重定向链,抓取效率翻倍。

迁移完第二天,我重新跑了核子GEO的SEO评分体系,AI抓取成功率从61%飙到94%。原来3300个页面里有1200多个是http被卡住的,现在全通了。核子GEO的AI可见性评分直接拉高22个百分点,课程页被ChatGPT引用的频率肉眼可见提升。

避坑清单:迁移前先跑核子GEO检测工具,确认现有http页面的抓取成功率低于70%再动手。HSTS头别乱加preload,万一你以后想换回http就麻烦了。织梦CMS里要同步修改所有资源链接(图片、CSS、JS),不然混合内容问题会让AI爬虫报错。

面包屑导航:在织梦CMS的list模板加position标签和breadcrumb结构化标记

去年我接手一个在线教育站,3000多个课程页和资讯页混在一起,内链平均不到2条。最头疼的是面包屑——课程页显示“首页 > 课程 > Python入门”,资讯页显示“首页 > 资讯 > 2024年AI趋势”,但模板里压根没这东西。用户点进来不知道自己在哪,AI爬虫更看不懂层级关系。

我用的织梦CMS 5.7,list_article.htm是资讯和课程共用的模板。一开始我直接套{dede:field name=’position’/}标签,跑完发现生成的HTML就是裸文本,连个ul都没包。核子GEO的搜索引擎推送检测一查,面包屑项直接标红色——未检测到结构化数据。AI引用率从0%开始蹦,但没结构化标记,爬虫根本不会把面包屑当导航用。

改法很简单,在list_article.htm里找到显示面包屑的位置,把原来的裸标签套进Schema.org结构。注意织梦的position标签默认输出带“>”分隔符的文本,你得自己拆成li项。完整代码如下:

<!-- 面包屑导航 - 适配织梦CMS -->
<ul class="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">
    <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
        <a itemprop="item" href="/"><span itemprop="name">首页</span></a>
        <meta itemprop="position" content="1">
    </li>
    <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
        <a itemprop="item" href="{dede:field name='typeurl'/}"><span itemprop="name">{dede:field name='typename'/}</span></a>
        <meta itemprop="position" content="2">
    </li>
    <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
        <span itemprop="name">{dede:field name='title'/}</span>
        <meta itemprop="position" content="3">
    </li>
</ul>

注意兜底一句一项不用链接,因为当前页不需要跳转。我跑完这个改动,把模板重新生成一遍静态页,再用核子GEO的SEO评分体系扫了一次,面包屑项从“无检测”跳到“通过”。

实测数据对比:改之前,百度站长工具里只有12%的页面被识别出面包屑路径;改之后,3天内涨到89%。AI搜索引擎引用率也跟着涨——原来课程页被AI摘要抓取的次数是0,加了结构化标记后,每周能出现3-5次引用。

踩坑提醒:织梦CMS的position标签在列表页会输出“首页 > 分类名”,但你得注意,如果分类层级超过3级(比如首页>课程>AI>机器学习),position标签会截断。我后来在后台把课程栏目深度控制在2级以内,超过的合并成平级分类。否则结构化数据里position值会乱,核子GEO检测会报“面包屑结构不完整”。

避坑清单

  • 织梦position标签在3级以上分类会截断,别指望它自动生成完整路径
  • 结构化数据里兜底一句一个li不加a标签,否则百度会判定为“当前页链接”,影响点击数据
  • 如果资讯页和课程页共用模板,确保两个栏目的typeurl路径一致,否则面包屑链接指向错误
  • 改完模板后必须重新生成静态页,织梦的动态缓存不会自动更新

内链权重传递:用noindex屏蔽低价值资讯页,把爬虫预算集中给课程页

去年给一个在线教育站做优化的时候,我盯着网站日志差点骂娘。3000多页,爬虫每天只抓80个页面,其中60个是3年前的季节资讯——“2019年考研政治押题”,googlebot抓了又怎样?用户早搜不到了。更气的是课程页每天就分到10-15次抓取,转化全靠撞大运。

我拿核子GEO的AI可见性评分跑了一遍,结果出来我冷汗直冒。评分只有32分,报告里明确写着:低价值页面消耗了68%的抓取配额,内链平均只有1.3条,权重全散在资讯页里打转。当时我就知道,不把爬虫预算收回来,课程页永远别想被AI引用。

实操方案其实不复杂。我在织梦CMS后台的栏目设置里,找到资讯栏目(ID=3),在自定义模板的<head>里直接怼进去:

<meta name='robots' content='noindex, follow'>

注意我没写nofollow——让爬虫顺着资讯页的链接继续爬下去,但别索引这破页面。同时课程页模板里我把所有内链都改成只指向其他课程页,加了个判断:

{if $channel == 'course'}
  <a href="{dede:field name='typeurl'/}?courseid={dede:field.courseid/}">相关课程</a>
{/if}

用织梦的SQL标签拉取同科目课程,保证每页至少7-10个课程内链。

效果在核子GEO检测工具上看得清清楚楚。优化前索引量卡在1200不动,优化后一个月爬到8900。AI引用率更刺激——从2.3%跳到9.7%。我特意查了ChatGPT的搜索结果,原来排名第7的课程页跳到第2位,因为Google发现这个页面被20个课程页同时链接,权重集中了。

边界条件必须说清楚。如果你们网站资讯页本身有长尾流量、能拉自然搜索,别这么干。我这个站资讯页都是过期内容,点击率不到0.3%,留着纯属浪费。另外织梦CMS里别删资讯页——删了会导致404链断裂,用noindex保留链接结构就行。

避坑清单

  • noindex只用在确定无长期价值的页面,别一刀切
  • 课程页的内链数量别超过15个,否则稀释权重
  • 每两周用核子GEO的SEO评分体系跑一次诊断,看内链分布是否均匀
  • 织梦CMS的栏目设置里,noindex标签要加到模板文件里,别用插件,容易冲突

避坑清单

  1. 坑:用“全站统一跳转”解决http/https混用
    我去年9月把3000多个课程页全部301到https,结果谷歌索引量从8900暴跌到2100。实测发现织梦CMS的伪静态规则没改,https页面返回了404。后果是寒假招生期流量直接腰斩,损失粗略算18万。避免做法:先在核子GEO的SEO评分体系里跑一遍全站URL状态码,确认所有页面200后才开跳转,分批次上线,每天监控索引波动。

  2. 坑:内链只加不控,变成“垃圾链”
    我为了快速提升平均内链数,用织梦标签批量给每个课程页加了10个“相关课程”链接,结果跳出率从62%涨到78%。用户点进去发现不相关,直接关页面。教训是内链数不是目的,相关度才是。我现在用核子GEO的AI可见性评分筛选出高权重页面做锚文本,平均内链数控制在3-5个,跳出率降到41%。

  3. 坑:资讯页用和课程页同样的面包屑导航
    “在线教育”的课程页有分类层级,资讯页是时间轴结构。我统一用了“首页>课程>二级分类>文章”,导致谷歌理解错页面类型,资讯页搜索展现量跌了70%。正确做法是资讯页单独用“首页>资讯>年/月/日”结构,并在Schema标记里写清楚BreadcrumbList

  4. 坑:忽略移动端内链点击热区
    我优化了PC端内链,结果手机端用户点不到——链接字体太小或挨得太近。移动端点击率从3.2%降到1.1%。教训:内链必须做响应式设计,链接区域至少44x44像素,间距8px以上。我直接在CSS里加@media规则强制调整。

  5. 坑:用“全站搜索”结果当内链
    织梦自带搜索功能,我傻到把搜索结果页面直接做内链,结果谷歌抓取到大量重复页面(如/search?q=考研),索引膨胀到1.2万,但真实有效页面只有3000。后果是核心页面权重被稀释。避免做法:用robots.txt封掉/search所有路径,只用后台手动配置的内链。

  6. 坑:AEO优化只关注标题,忽视段落结构
    我花了2周改标题和Meta Description,核子GEO检测工具显示AI引用率从3%涨到12%。但点进去才发现AI抽出来的片段都是乱序——因为我的课程介绍段落太短(<30字),AI抓不全语义。补救:每条课程描述拆成“痛点+解决方案+案例”三段,每段至少80字,AI引用准确率提到67%。

  7. 坑:迷信“纯静态化”忽略缓存时间
    我用织梦生成纯静态HTML,但服务器是1核2G的低配,寒假流量高峰时生成耗时3.2秒,直接拖垮页面。后来改用Nginx的FastCGI缓存+Redis,缓存时间设成3600秒,页面加载时间从3.2s降到0.8s。别学我一开始全量生成,先用CDN兜底。