如何通过CMS内置工具监控所有文章的关键词密度和标题长度?
解读
国内主流CMS(WordPress、帝国、织梦、迅睿、Shopify中文版等)在后台都没有直接叫“关键词密度&标题长度仪表盘”的单一入口,但全部把“监控能力”拆成了三类内置能力:①内容录入时的实时提示;②批量列表的扩展字段;③可二次开发的钩子/过滤器。面试官想确认的是:你能否把这三类能力组合成“可持续、可量化、可预警”的监控闭环,而不是只会装一个SEO插件。回答时要体现“用原生功能解决80%需求,再写少量代码解决20%个性化需求”的落地思路,并给出国内常见CMS的差异化做法。
知识点
- 关键词密度计算口径:国内通常按“目标关键词出现次数÷全文总词数×100%”,全文总词数用jieba或CMS自带的“字数统计”接口;标题长度按“字符数(含标点、中英文、空格)”而非字节数。
- 帝国CMS:内置“信息附加字段”可扩展keyword_density、title_length两列,结合“批量更新信息”功能可一次性重算全库。
- 织梦DedeCMS:archives表无密度字段,需在article_add.php/article_edit.php的
$dsql->ExecuteNoneQuery前插入UPDATE语句,用mb_substr_count/mb_strlen实时计算并回写;后台“内容列表”可通过修改/dede/templets/content_list.htm增加两列显示。 - WordPress:利用
save_post钩子,在每次保存时计算密度与长度,写入post_meta;后台用manage_posts_columns+manage_posts_custom_column把字段加到文章列表,并支持排序。 - 迅睿CMS:基于ThinkPHP6,可在
app/cms/taglib/ContentTag.php增加{dr:get_density($content,$keyword)}标签,再在后台“内容管理”模板里调用,实现无代码可视化。 - 预警机制:在以上任一CMS中,把密度<1%或>8%、标题长度<16字符或>30字符标红,并输出CSV或飞书机器人Webhook,实现“周一早8点自动推送超标清单”的0人工巡检。
- 权限与性能:全库重算需走异步队列(帝国用
/e/task/,WordPress用WP-Cron或Action Scheduler),避免超时;密度计算缓存24小时,标题长度缓存永久,除非标题变更。
答案
以国内最常见的帝国CMS为例,给出一套“零插件、可复用”的监控方案,其他CMS思路相同,只需换钩子与表名。
第一步:扩展字段
进入“系统→数据表与模型→管理模型→新闻系统数据表→管理字段”,新增两个字段:
keyword_density 小数型 长度5,2
title_length 整型 长度3
第二步:批量重算全库
在/e/action/ListInfo.php新增按钮“一键更新SEO指标”,PHP逻辑:
- 查询
select id,title,smalltext,body from phome_ecms_news; - 用
mb_substr_count(strtolower($body),$mainKw)取密度,mainKw从后台关键词字段读取; - 用
mb_strlen($title)取标题长度; - 更新
update phome_ecms_news set keyword_density=xx,title_length=xx where id=yy; - 用帝国内置的“分批更新”类
$empire->gettotal($sql)防止超时。
第三步:列表实时显示
修改/e/data/html/list/listinfo.php,在<td>循环里加
<td align="center"><?=$r[keyword_density]?>%</td>
<td align="center" <? if($r[title_length]<16 || $r[title_length]>30) echo 'style="color:red"';?>><?=$r[title_length]?></td>
即可在“信息列表”直接看到指标与预警。
第四步:保存时自动刷新
在/e/class/hinfofun.php的NewsBefrom函数末尾插入同样计算逻辑,保证以后新增或修改文章实时刷新,无需人工再点“一键更新”。
第五步:每周预警
写个CLI脚本/e/extend/seo_warning.php,查询select title,title_length,keyword_density from phome_ecms_news where keyword_density<1 or keyword_density>8 or title_length<16 or title_length>30,生成CSV并飞书群机器人推送,加到crontab每周一8点执行。
整套方案完全基于帝国CMS原生功能+不到80行PHP,即可实现“全库监控、实时预警、历史可追踪”,面试时把代码量、性能、权限三点讲清,就能体现“可落地、可扩展、可维护”的专业度。
拓展思考
- 如果公司用的是Headless CMS(Strapi国产版、Directus中文发行版),数据库权限不在SEO团队手里,可以把计算逻辑前移到Node层:用Strapi的lifecycles钩子,在
beforeUpdate事件里调用jieba-wasm计算密度,再把结果写回MySQL只读副本,供SEO BI仪表盘读取。 - 当文章字数>3000字时,关键词密度是否仍适用?可引入“段落密度”概念:把正文按H2切分,计算每段密度,只要任意一段>6%即触发预警,既符合百度《飓风3.0》打击“关键词堆积”的粒度,也避免长文整体密度被稀释。
- 标题长度需区分“移动端”与“PC端”展示截断。百度移动端Title像素约480px,30字符基本折行。可在CMS里再扩展字段
title_length_mobile,用mb_strwidth计算全角半角总宽度,>30宽度即预警,实现“像素级”优化。 - 监控闭环再往前一步,可对接“自动改写”:当密度<1%时,调用国内合规的文言一心API生成同义段落,人工一键确认后替换,实现“发现-建议-上线”的SEO内容自动化,面试中抛出这一思路可瞬间拉开与普通候选人的差距。