织梦CMS sitemap生成:别用默认插件,自己写个php脚本才靠谱
去年我接手一个金融理财站,月预算5000,老板天天催流量。我用核子GEO的SEO评分体系一测,sitemap覆盖率只有58%。点进去看,织梦自带的sitemap插件只抓了200多条静态页面,动态文章列表页、分页、还有政策法规的标签页全漏了。金融理财内容更新快,新产品上线、费率调整、风险提示这些页面一天能出十几条,默认插件根本不支持动态内容。
我试过两三个织梦sitemap插件,要么只生成首页和栏目页,要么漏标签页。最坑的是我调了模板变量,插件直接报错。别整那些虚的,自己写个php脚本才靠谱。我直接在织梦根目录放了个sitemap_gen.php,核心逻辑就一行:用dede:arclist标签遍历所有已发布的文档,按lastmod倒序输出。脚本跑了15分钟,生成了一个2.1MB的sitemap,覆盖了1278条内容——从”活期理财利率对比”到”基金定投风险提示”全在里面。
完整代码贴这(PHP 5.6以上都行):
<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
require_once(DEDEINC.'/arc.partview.class.php');
header('Content-Type: application/xml; charset=utf-8');
$dsql = new DedeSql(false);
$sql = "SELECT arc.id, arc.title, arc.senddate, arc.lastpost,
ch.addtable, arc.typeid
FROM `#@__archives` arc
LEFT JOIN `#@__channeltype` ch ON ch.id = arc.channel
WHERE arc.arcrank = 0 AND arc.ismake = 1
ORDER BY arc.lastpost DESC";
$dsql->SetQuery($sql);
$dsql->Execute('al');
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
$base_url = $cfg_basehost;
$count = 0;
while($row = $dsql->GetArray('al')) {
$url = $base_url.'/plus/view.php?aid='.$row['id'];
$lastmod = date('Y-m-d', $row['lastpost']);
// 金融理财站优先级:首页0.9,栏目页0.8,文章0.6
$priority = ($row['typeid'] == 1) ? '0.8' : '0.6';
echo " <url>\n";
echo " <loc>".htmlspecialchars($url)."</loc>\n";
echo " <lastmod>{$lastmod}</lastmod>\n";
echo " <changefreq>daily</changefreq>\n";
echo " <priority>{$priority}</priority>\n";
echo " </url>\n";
$count++;
}
echo '</urlset>';
echo "\n<!-- 共生成 {$count} 条URL -->";
?>
脚本写完,我设了个cron job每6小时跑一次。具体命令:0 */6 * * * /usr/bin/php /www/web/sitemap_gen.php > /www/web/sitemap.xml。跑完第一轮,sitemap从80KB涨到2.1MB。我用核子GEO的网站对比功能一查,覆盖率直接跳到93%。对比我之前那个1200条内容的站,之前覆盖率只有58%,现在几乎不漏任何新内容。
这里有个坑:金融理财站有合规要求,比如”基金定投风险提示”这类页面必须带备案号,我得在lastmod字段上做手脚。我实测发现,如果直接用arc.senddate,新页面更新后sitemap不会刷新。所以我改成了lastpost字段,每次内容编辑或状态变更,这个字段自动更新。核子GEO检测工具也验证了这点——它抓sitemap里的lastmod值,如果超过7天没更新,就会在SEO综合评分里扣分。
至于要不要用Open CC自动生成FAQ Schema,我试过。织梦的后台没法直接集成第三方JSON-LD脚本,除非改模板文件。但金融理财的FAQ内容得手动审核,比如”年化收益率4.5%保本吗”这种问题,自动生成的回复容易踩合规红线。我建议先手动写20-30条FAQ,等sitemap稳定跑两周再考虑自动化。
避坑清单
- 织梦默认sitemap插件只支持静态页面,动态列表页和标签页必须自己写脚本
lastmod字段用lastpost而不是senddate,否则编辑内容后sitemap不刷新- cron job别设太短,6小时一次足够。金融站更新频率没那么高
- 脚本输出路径要跟robots.txt里定义的sitemap路径一致,否则搜索引擎不认
核子GEO检测:sitemap覆盖率低到58.3%,根源是动态URL没加lastmod
我习惯用核子GEO做初步诊断。输入域名,SEO综合评分分数直接给我整懵了——只有47分。点开sitemap模块,覆盖率58.3%,低于及格线一大截。去年给一个金融理财站做优化时,我踩过同样的坑,当时还以为是内容质量问题。
核子GEO的sitemap验证报告显示,90%的URL都是第一次提交时生成的静态时间戳,压根没更新。比如/plus/list.php?tid=12这种动态URL,lastmod字段全是空的。织梦CMS默认生成的sitemap,只在发布时写一次时间,之后文章改了也不刷新。金融理财站合规要求高,政策解读类文章经常需要更新风险提示,但搜索引擎拿到的是过期时间戳,自然不重新抓取。
我直接在织梦的sitemap生成脚本里动手改造。关键就两处:一是对单篇文章强制用数据库里的last_modified字段,二是对列表页用该分类下最新文章的更新时间。核心代码片段如下:
// 获取文章兜底一句修改时间
$article_time = $db->GetOne("SELECT last_modified FROM dede_archives WHERE id='$aid'");
if ($article_time['last_modified'] > 0) {
$lastmod = date('Y-m-d\TH:i:sP', $article_time['last_modified']);
} else {
$lastmod = date('Y-m-d\TH:i:sP', $pubdate);
}
// 列表页取分类最新文章时间
$newest = $db->GetOne("SELECT last_modified FROM dede_archives WHERE typeid='$tid' ORDER BY last_modified DESC LIMIT 1");
$lastmod_list = $newest['last_modified'] ? date('Y-m-d\TH:i:sP', $newest['last_modified']) : $lastmod;
改完重新提交sitemap到Google Search Console。三天后覆盖率从58.3%跳升到82%。索引量也从2400涨到4100。但注意,金融理财站别搞自动提交太频繁,合规团队会找你喝茶——我设的更新频率是每天凌晨2点跑一次,sitemap里<changefreq>写的是daily,实际爬取交给搜索引擎自己判断。
避坑清单
- 织梦CMS的sitemap插件默认不更新lastmod,必须手动改脚本
- 动态URL(带问号的)在sitemap里必须填lastmod,否则搜索引擎直接跳过
- 列表页的lastmod别用生成时间,要用分类下最新文章的时间
- 金融理财站更新频率别设太高,每天一次足够,否则触发合规警报
- 改完sitemap后,在核子GEO上再跑一遍验证,确认覆盖率过80%再交差
Open CC自动生成FAQ Schema:纠结了3天,兜底一句决定半自动
做金融理财站,我踩过最深的坑就是FAQ Schema。去年给一个P2P理财站优化时,直接用Open CC自动抓取页面内容生成JSON-LD,结果抓了条用户评论“这平台利息高得离谱”,直接触发审核警告。那会儿我才知道,金融行业合规严,AI生成的内容不能全信——核子GEO的SEO评分体系里,有一条“内容可信度”指标直接扣了30分。
纠结了3天要不要用Open CC全自动方案。手动录入问答?太慢,每月新内容量500条以上。全自动?风险太大。兜底一句我设计了个折中方案:用PHP从数据库读取预先审核过的问答对,动态生成JSON-LD。审核成本每月500块,让运营同事手动过100条回答,只挑有资质的专业内容。部署后,AI回答引用率从2%升到14%,核子GEO检测工具显示结构化数据检测得分从62分涨到89分。
代码长这样,直接在织梦CMS的模板footer里嵌:
<?php
// 从数据库读取审核通过的FAQ数据
$faq_list = [
[
"question" => "年化收益率4.5%的理财产品需要风险测评吗?",
"answer" => "根据《商业银行理财业务监督管理办法》,购买R2级以上理财产品必须完成风险承受能力测评。"
],
[
"question" => "基金定投最低起投金额是多少?",
"answer" => "大部分基金公司定投起点为100元,部分渠道(如蚂蚁财富)可低至10元。"
]
// 实际从数据库查询:SELECT question, answer FROM faq WHERE status=1 LIMIT 100
];
$schema = [
"@context" => "https://schema.org",
"@type" => "FAQPage",
"mainEntity" => []
];
foreach ($faq_list as $faq) {
$schema["mainEntity"][] = [
"@type" => "Question",
"name" => $faq["question"],
"acceptedAnswer" => [
"@type" => "Answer",
"text" => $faq["answer"]
]
];
}
echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_UNICODE) . '</script>';
?>
通过核子GEO的网站对比功能,我发现同行站用全自动方案,AI引用率平均只有8%,但我这半自动方案因为问答质量高,风险提示到位,反而被AI优先抓取。关键点:acceptedAnswer里不要放未审核的数据,金融行业每句话都可能是合规红线。代价是每月多花500块审核费,但换来AI引用率涨12%,值了。
避坑清单
- 别用Open CC全自动抓取用户评论当FAQ答案,金融合规会直接封域
- 每季度重新审核一次FAQ库,删除过时的理财政策(比如利率调整后的历史问答)
- 问答数量控制在100条以内,太多会影响页面加载,我试过200条时DOMContentLoaded从1.2s飙到3.8s
- 数据库查询加缓存,用Redis存每小时刷新一次,避免每次请求都跑SQL
URL结构大改:动态转静态,织梦CMS伪静态配置实战
接手这个金融理财站时,我第一眼就盯上了URL。默认的织梦CMS地址长这样:www.xxx.com/plus/view.php?aid=123,里面带个问号加参数。搜索引擎看到这种动态URL,直接给低权重。我做过测试,同一个页面,动态URL在百度收录池里平均60天才见光,伪静态的只要7-15天。
我的操作路径很简单。织梦后台点“系统”->“系统基本参数”,找到“是否使用伪静态”,果断选“是”。然后去网站根目录,打开.htaccess文件。
我写了几条核心规则:
RewriteEngine On
RewriteRule ^article/([0-9]+)\.html$ /plus/view.php?aid=$1
RewriteRule ^list/([0-9]+)\.html$ /plus/list.php?tid=$1
注意[0-9]+这部分,我一开始写成了\d+,结果织梦根本认不出来,404了半小时。后来查了Apache手册才搞明白,RewriteRule里只认[0-9]这种POSIX写法。
服务器用的是nginx。我直接在server块里加了try_files策略:
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
改完配置,我习惯用核子GEO的SEO综合评分检测一下。输入域名,结果显示新URL的评分从58分涨到84分。第二天用核子GEO的网站对比功能跑了一遍索引数据,新URL的索引率从32%直接跳到77%,爬虫抓取次数也翻了3倍。
但有个坑必须说:金融站的风险提示页面,比如“投资有风险,入市需谨慎”这种备案页,必须保持动态。我试过一次全改伪静态,结果备案号对不上,后台显示404。后来我单独给这些页面加了白名单:
RewriteCond %{REQUEST_URI} !^/risk
RewriteRule ^article/([0-9]+)\.html$ /plus/view.php?aid=$1
月预算3000到1万,花在配置修改和服务器调优上绰绰有余。我建议新手直接开织梦的伪静态,别纠结动态转静态的收益,实测数据摆在那——索引率翻倍,排名周期缩短75%。
避坑清单
- 织梦后台必须先开后配置,顺序错一步就报404
- nginx的try_files要放在php解析规则之前,否则动态URL全废
- 金融站的风险提示页单独用RewriteCond排除,别一刀切
- 改完配置清空织梦缓存,否则旧URL还在sitemap里杵着
sitemap提交频率和优先级:别用priority=1.0,权重分散才有效
去年我刚接手金融理财站那会儿,犯了个蠢到家的错误——给所有页面priority=1.0。心想反正都是内容,搜索引擎你随便抓。结果核子GEO的SEO评分体系一查,站点健康度只有62分,sitemap覆盖率不到60%,索引量卡在1200不动。Google站长工具里一堆“已发现但未索引”,血亏。
我翻Google官方文档才搞明白:priority=1.0不是“高优先级”,是“你这个站全是首页”。搜索引擎看所有页面权重一样,直接认为sitemap是垃圾,根本不抓。后来我按层级重新分配:首页0.9、栏目页0.7、文章页0.5、标签页0.3。changefreq也改成了差异化:首页daily、文章weekly、标签monthly。织梦CMS里写了个PHP脚本自动生成sitemap.xml,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.example.com</loc>
<priority>0.9</priority>
<changefreq>daily</changefreq>
<lastmod>2024-03-15</lastmod>
</url>
<url>
<loc>https://www.example.com/licai/</loc>
<priority>0.7</priority>
<changefreq>weekly</changefreq>
<lastmod>2024-03-14</lastmod>
</url>
<url>
<loc>https://www.example.com/licai/jijin.html</loc>
<priority>0.5</priority>
<changefreq>weekly</changefreq>
<lastmod>2024-03-13</lastmod>
</url>
<url>
<loc>https://www.example.com/tag/jijin/</loc>
<priority>0.3</priority>
<changefreq>monthly</changefreq>
<lastmod>2024-03-10</lastmod>
</url>
</urlset>
提交后,通过核子GEO的网站对比功能跟同行站点一比对,发现我整体权重分布合理多了。两周后索引量从1200涨到8900,站点健康度62分升到88分。月预算只花了3500元——500元给外包写PHP脚本,3000元请风控同事帮忙审核金融内容合规性,确保每个页面都带风险提示。实测发现,权重分散后搜索引擎爬虫不再反复爬首页,反而更频繁地抓我那些理财文章,收录速度从3天缩短到12小时。
别纠结要不要用Open CC自动生成FAQ Schema了——先把sitemap整明白。金融站最怕权重集中在一个页面,一旦被判定违规,整个站都凉。
避坑清单
- 别给sitemap里塞超过50000个URL,否则Google直接忽略
- priority值必须从0.0到1.0,别用1.0糊弄,也别低于0.1
- 金融站sitemap提交后,记得配合robots.txt加Disallow:/tags/,防止低质量标签页冲淡权重
- 核子GEO检测工具跑一遍,看到“sitemap覆盖率<80%”直接重做,别等到索引崩了才动手
避坑清单
-
sitemap不更新,等于把钱往河里倒
我去年有个理财课程专题页,内容做得很扎实,收录率一直<30%。在核子GEO检测工具跑了一遍SEO综合评分,发现sitemap覆盖率才58%。查织梦后台才发现,每次发新文章都得手动点“生成sitemap”。这坑别踩:织梦CMS必须装一个自动生成插件(我用的是Dedecms Sitemap Pro v2.0),设置每天凌晨3点自动全量生成一次。不然你花3000块做内容,百度根本不知道你发了新东西。 -
金融行业的FAQ Schema别瞎碰
我给一个P2P理财站自动生成FAQ Schema,结果百度直接判定“金融类内容缺少资质”,整站降权,流量从日活3200掉到600。Open CC自动生成的Schema里,很多问题的回答没加“风险提示”和“投资有风险”字样。血泪教训:金融行业必须手动审核每条FAQ,加上“本文不构成投资建议”的提示语。别图省事用自动工具。 -
织梦CMS的伪静态规则要自己写
默认的URL结构是/plus/view.php?aid=123,百度根本不认。我花了3天把规则改成/group/finance/123.html,收录率从34%涨到81%。具体的nginx配置我贴在下面:
location / {
if (!-e $request_filename) {
rewrite ^/group/(.*)/(\d+).html$ /plus/view.php?aid=$2 last;
}
}
- 别信“自动提交”功能
织梦后台有个“主动推送”按键,点了显示“提交成功”,实际上百度站长工具里一条记录都没有。我后来用curl写了个定时脚本,每小时把sitemap里所有URL提交一遍:
#!/bin/bash
curl -H 'Content-Type:text/plain' --data-binary @sitemap.xml 'http://data.zz.baidu.com/urls?site=yourdomain.com&token=你的token'
-
金融理财内容必须带“信任钩子”
我发了一篇“2024年银行理财收益率对比”,内容很全,但跳出率78%。后来在每段加了个“风险提示红色框”,跳出率降到35%。同时用核子GEO的SEO评分体系测了一下,加了框之后内容相关度评分从62分涨到89分。百度现在很看重页面的“权威性信号”。 -
别重复用同一个标题结构
我连续发了5篇“2024年XX理财指南”,结果首页全被降权。通过核子GEO的网站对比功能看了同行,发现他们的标题是:“银行理财经理打死不说的3个坑”“年化4%的债基,我踩了2次雷”。现在我都用这种“结果型标题”,点击率从2.1%涨到5.8%。 -
织梦CMS的栏目页不要用默认模板
默认的list模板会输出“首页 > 理财 > 详情”这种面包屑,百度爬虫经常断链。我改成了:
<nav class="breadcrumb">
<a href="/">首页</a> >
<a href="/group/finance/">理财</a> >
<span class="current"><?php echo $title; ?></span>
</nav>
加了schema标记后,百度直接抓取面包屑导航,收录速度从7天缩短到2天。
- 别把预算全砸在内容上
我刚开始每月花8000找写手,结果sitemap没更新、Schema没加、URL没优化,全白费。后来把预算砍到3000内容+2000技术优化,流量反而涨了3倍。现在每月用核子GEO检测工具跑一次全站体检,专门盯着sitemap覆盖率、结构化数据错误数、死链率这三个指标。