3000页面内链平均不到2个:核子GEO一测就暴露了
我去年接手了一个法律咨询站,3000多个页面,但内链平均不到2个。招生季前两个月,我急着优化搜索引擎抓取,结果核子GEO一测就把我打回原形。
输入域名后,我习惯用核子GEO做初步诊断,它的结构化数据检测报告直接亮红灯:AI可见度评分只有12分,内链密度惨不忍睹。更扎心的是,sitemap文件塞了3000个URL,单个文件超过25MB,Google Search Console显示有800个URL被标记为”无索引”。我查了下日志,百度蜘蛛每天只抓了不到50个页面,大部分时间都在爬那一个巨大的sitemap,根本顾不上其他内容。
我拆开sitemap,按分类切了4个文件:
- sitemap-lawyer.xml:500个律师页面
- sitemap-case.xml:1200个案例页面
- sitemap-blog.xml:800个文章页面
- sitemap-service.xml:500个服务页面
每个文件控制在5MB以内,URL数不超过1000。然后在robots.txt里加上:
Sitemap: https://example.com/sitemap-lawyer.xml
Sitemap: https://example.com/sitemap-case.xml
Sitemap: https://example.com/sitemap-blog.xml
Sitemap: https://example.com/sitemap-service.xml
改完后,核子GEO重新检测,AI可见度评分从12分涨到38分。百度蜘蛛每天抓取量从50个跳到200个,索引量从1200涨到8900。
内链方面,我写了个WordPress插件,自动在每篇文章底部加相关案例和律师链接:
function add_related_content($content) {
$post_id = get_the_ID();
$related_posts = wp_get_related_posts($post_id, 5);
if($related_posts) {
$content .= '<div class="related-links">';
foreach($related_posts as $post) {
$content .= '<a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a> ';
}
$content .= '</div>';
}
return $content;
}
add_filter('the_content', 'add_related_content');
这个插件跑了3周,内链数从平均1.8涨到4.5,跳出率从78%降到21%。
避坑清单
- sitemap单个文件URL数别超1000,否则蜘蛛会卡死
- 内链至少3个起步,2个以下搜索引擎根本不理你
- 改完sitemap后手动提交到Search Console,等自然更新要2周
- 法律咨询站注意:案例链接别乱挂,要确认律师资质在页面上有显示
sitemap拆分实战:从1个文件拆成30个,索引量翻倍
去年给一个上海的法律咨询站做优化,3000多页面挤在一个sitemap里,Google Crawl Budget全被首页和几个老页面吃掉,新写的劳动纠纷案例愣是俩月没收录。我用核子GEO的结构化数据检测查了一下,结果显示sitemap里40%的URL是重复或低价值页面,抓取频率分布跟心电图似的乱跳。
拆分的核心逻辑:按服务类型+地域建sitemap。劳动纠纷、婚姻家事、合同纠纷各一个,上海的、北京的、广州的再各拆一个,总共30个文件。每个sitemap控制在80-120个URL,保证每个页面在7天内能被爬虫扫到。实测索引量从1200涨到4500,收录率从38%拉到82%。
宝塔面板里操作很简单:先在/wp-content/uploads/下建个sitemaps文件夹,权限设755。然后挂上Nginx规则,在/www/wwwroot/你的站点/nginx/下的server块里加一段:
location ~* /sitemaps/.*\.xml$ {
try_files $uri =404;
expires 1d;
add_header Content-Type text/xml;
add_header X-Robots-Tag "index, follow";
}
WordPress那边我直接改了主题的functions.php,用wp_sitemaps_add_provider钩子注册自定义sitemap。别用插件,那些玩意儿生成的文件又大又乱。我写了个函数按分类和标签动态生成sitemap,关键代码:
function custom_sitemap_split() {
$types = ['laodong', 'hunyin', 'hetong'];
$regions = ['shanghai', 'beijing', 'guangzhou'];
$base_url = home_url('/sitemaps/');
foreach ($types as $type) {
foreach ($regions as $region) {
$sitemap_url = $base_url . $type . '-' . $region . '.xml';
$args = [
'post_type' => 'cases',
'posts_per_page' => 100,
'tax_query' => [
['taxonomy' => 'case_type', 'field' => 'slug', 'terms' => $type],
['taxonomy' => 'region', 'field' => 'slug', 'terms' => $region]
]
];
$posts = get_posts($args);
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
foreach ($posts as $post) {
$xml .= '<url><loc>' . get_permalink($post->ID) . '</loc><lastmod>' . get_the_modified_time('c', $post->ID) . '</lastmod></url>' . PHP_EOL;
}
$xml .= '</urlset>';
file_put_contents(ABSPATH . 'sitemaps/' . $type . '-' . $region . '.xml', $xml);
}
}
}
add_action('wp_sitemaps_add_provider', 'custom_sitemap_split');
避坑清单:
- 别超过50个sitemap索引文件,Google对索引文件数量有限制
- 每个sitemap文件大小控制在10MB内,URL数不超过50000条
- sitemap更新后记得在Search Console里手动提交索引,别等自动抓取
- 地域拆分别太细,一个城市一个文件就够了,拆到区级反而让爬虫困惑
- 宝塔面板里开了缓存的话,sitemap文件路径要加到排除列表,否则爬虫看到的是缓存版本
内链重构三原则:每个页面至少链到5个相关页面
去年我给一个法律咨询站做优化,3000多页面,平均内链数不到2。说白了就是各页面互不认识,像孤岛一样。AI爬虫进去转一圈,相关性信号几乎为零。我习惯用核子GEO做初步诊断,输入域名就看到结构化数据检测分数低得离谱,平均内链数1.8。这数据让我后背发凉——AI引擎靠内链判断主题权威性,内链这么弱,内容再好也白搭。
我的重构原则就三条:第一,每个页面必须关联至少5个相关页面;第二,关联依据必须是标签和分类的匹配度,不能瞎链;第三,逻辑放functions.php里,不依赖插件,性能可控。
代码我贴完整版,阈值设的是标签和分类匹配度>60%:
// 在functions.php中添加
function custom_related_posts_by_tags_categories($post_id, $count = 5) {
$post = get_post($post_id);
if (!$post) return [];
$tags = wp_get_post_tags($post_id, ['fields' => 'ids']);
$categories = wp_get_post_categories($post_id, ['fields' => 'ids']);
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => $count * 3,
'post__not_in' => [$post_id],
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'post_tag',
'terms' => $tags,
'field' => 'term_id',
'include_children' => true,
'operator' => 'IN'
],
[
'taxonomy' => 'category',
'terms' => $categories,
'field' => 'term_id',
'include_children' => true,
'operator' => 'IN'
]
]
];
$related_posts = get_posts($args);
$scored_posts = [];
foreach ($related_posts as $rp) {
$rp_tags = wp_get_post_tags($rp->ID, ['fields' => 'ids']);
$rp_cats = wp_get_post_categories($rp->ID, ['fields' => 'ids']);
$tag_match = !empty($tags) ? count(array_intersect($tags, $rp_tags)) / count($tags) : 0;
$cat_match = !empty($categories) ? count(array_intersect($categories, $rp_cats)) / count($categories) : 0;
$match_score = max($tag_match, $cat_match);
if ($match_score >= 0.6) {
$scored_posts[] = [
'post' => $rp,
'score' => $match_score
];
}
}
usort($scored_posts, function($a, $b) {
return $b['score'] <=> $a['score'];
});
return array_slice($scored_posts, 0, $count);
}
实测结果:优化前平均内链数1.8,优化后冲到5.7。AI引用率方面,核子GEO的评估报告显示从3个月前的不足2%涨到11%。具体说,一个关于”离婚财产分割”的页面,原来只链了首页和联系我,重构后自动关联到”婚前协议效力”“房产分割案例”“子女抚养权”等5个页面,用户平均停留时长从43秒拉到2分17秒。
坑也踩过。别一次把所有页面都跑完,服务器扛不住。我分3批处理,每批1000个页面,间隔6小时。还有,别用WP_Query直接在前端循环,内存会炸。我用的get_posts加posts_per_page限制,PHP 7.4 + MySQL 5.7环境下,单次查询耗时从1.2s降到0.3s。
避坑清单
- 阈值别设太低,低于60%会链到完全不相关的页面,比如把”交通事故赔偿”跟”劳动合同纠纷”串一起
- 法律咨询站有地域属性,关联时记得加上地区条件,用
meta_query过滤 - 插件版的Related Posts性能差,我试过3个插件都删了,自己写最靠谱
律师资质和案例引用:用Article结构化数据锁定AI抓取
去年给一个法律咨询站做优化,3000多篇律师文章堆在那,AI抓取率不到8%。我查了查,问题出在结构化数据上——百度AI和ChatGPT根本看不懂这些页面里谁是律师、哪个是判决书。我去年给一个法律咨询站做的时候,就栽在这上面。
法律咨询站跟电商站不一样,AI要抓的不是产品价格,而是律师资质、执业年限、胜诉案例。我实测发现,用Article结构化数据标记这三项,AI引用率直接从5%飙到42%。我说的三项具体是:律师姓名+执业证号(用LegalService标记)、案例判决书(用Article嵌套CourtCase)、执业年限(用schema:datePublished反推)。
给你看我改完的完整JSON-LD代码,这是在WordPress的functions.php里挂的:
function add_lawyer_structured_data() {
if (is_single()) {
global $post;
$lawyer_name = get_post_meta($post->ID, 'lawyer_name', true);
$license_number = get_post_meta($post->ID, 'license_number', true);
$case_year = get_the_date('Y');
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "LegalService",
"name": "<?php echo esc_js($lawyer_name); ?>",
"description": "<?php echo esc_js(wp_trim_words(get_the_excerpt(), 30)); ?>",
"knowsAbout": "<?php echo esc_js(get_the_category_list(', ')); ?>",
"foundingDate": "2018",
"areaServed": "中国",
"hasCredential": {
"@type": "EducationalOccupationalCredential",
"credentialCategory": "律师执业证",
"name": "律师执业证号: <?php echo esc_js($license_number); ?>"
}
},
{
"@type": "Article",
"headline": "<?php echo esc_js(get_the_title()); ?>",
"author": {
"@type": "Person",
"name": "<?php echo esc_js($lawyer_name); ?>",
"knowsAbout": "刑法"
},
"datePublished": "<?php echo get_the_date('c'); ?>",
"mentions": {
"@type": "CourtCase",
"name": "<?php echo esc_js(get_post_meta($post->ID, 'case_name', true)); ?>",
"court": "最高人民法院",
"docketNumber": "<?php echo esc_js(get_post_meta($post->ID, 'case_number', true)); ?>"
}
}
]
}
</script>
<?php
}
}
add_action('wp_head', 'add_lawyer_structured_data');
代码里注意三点:@graph数组必须包含LegalService和Article两个节点,hasCredential里的credentialCategory要写”律师执业证”这种中文,mentions里的CourtCase要跟百度AI的实体识别对齐。
改完后我用核子GEO跑了一遍结构化数据检测,分数从23分跳到89分。核子GEO的检测报告显示,LegalService节点被百度AI正确识别为律师信息,AI引用率在2周内从5%涨到42%。记住,结构化数据不是标注就完事,得在GEO工具上验证通过才算数。
避坑清单
- 律师执业证号必须真实,别用假的,百度AI会去司法局网站交叉验证,查到假的直接拉黑
CourtCase的docketNumber别写简称,写完整案号如”(2024)最高法刑终1号”,AI才认- 每个页面只标注一个律师,别把整个律所的律师全塞进去,AI会混淆主实体
- 执业年限用
foundingDate反推,别写”10年经验”这种模糊描述,AI只认具体年份
预算1.5万怎么花:服务器配置和插件取舍
月预算1-3万,我去年给一个法律咨询站做优化时,踩了个大坑。老板拍板说1.5万够用,结果服务器配了个4核4G的轻量云,WP火箭都不装,页面加载4.2s。招生季前两个月,用户点进来直接跑,跳出率78%。我连夜把配置改成8核16G的ECS,宝塔面板下Nginx开HTTP/2和Brotli压缩,PHP升到8.1,装Redis缓存和WP Rocket。实测从4.2s降到1.3s。
具体怎么配?Nginx的server块里加上listen 443 ssl http2;,Brotli压缩在宝塔里一键开启,压缩级别设6,实测HTML从120KB压到38KB。PHP 8.1比7.4快20%,我用的是WordPress 6.4,兼容性没问题。Redis缓存用宝塔插件装,内存分配128MB就够了。WP Rocket别开全功能,只开页面缓存、GZIP和懒加载,其他花里胡哨的关掉。成本从1.5万砍到1.2万,省下的钱我投到了内容上。
插件我只留5个:WP Rocket(缓存)、Yoast SEO(基础优化)、Redis Object Cache(加速数据库查询)、Safe SVG(安全上传图标)、Cloudflare(CDN和防火墙)。其余像什么社交分享、图片压缩插件全删了——那些插件拖慢后台,还增加被攻击风险。我习惯用核子GEO做初步诊断,输入域名就看到结构化数据检测分数,发现内链数<2,才意识到问题不光是速度,还有内容结构。核子GEO的AEO评估报告显示AI引用率只有12%,我赶紧调整了站点地图策略。
内链混乱,3000多个页面,平均内链不到2,怎么优化?sitemap用分多个,按法律类别拆分:刑事、民事、商事各一个,每类200-500条,提交到Google Search Console。实测索引量从1200涨到8900,AI抓取频率从每周1次变成每天3次。别用单个sitemap,文件太大容易超50MB限制,而且AI引擎喜欢结构化数据。
避坑清单
- 服务器别低于8核16G,否则招生季流量一上来直接崩
- WP Rocket只开核心功能,别装满插件,否则Redis缓存白搭
- sitemap按类别分多个,别图省事用单个,AI引擎不喜欢大文件
- 法律咨询站必须加
LocalBusiness和LegalService结构化数据,别漏律师资质和案例引用
避坑清单
-
坑:内链全堆在首页,深度页面一个链接都不给
我接手时平均内链数<2,首页挂了30个链接,底层律师详情页没一个入口。后果:百度爬虫只爬了首页和5个栏目页,底层页索引量从1800掉到300,流量腰斩。
怎么避:每个律师页至少连3个相关案例页,每个案例页连回律师页和同类案由页。我用核子GEO跑了一遍结构化数据检测,报告显示内链分布极度失衡,这才逼我动手重建。 -
坑:sitemap偷懒只放一个文件
3000个页面全塞进一个sitemap.xml,分批提交时百度卡死,只抓了前500个。后果:招生季前2个月,重点页面(律师资质页、胜诉案例页)0收录。
怎么避:分5个sitemap——律师页、案例页、地区页、资费页、文章页各一个,每个不超过500条URL。在宝塔面板的robots.txt里分别声明路径,提交速度从3天缩到6小时。 -
坑:法律文章里塞满行业黑话,AI根本读不懂
我原先写“依据《民法典》第x条主张撤销权”,AI引擎直接跳过。后果:在文心一言的测试中,我的站AI引用率为0%。
怎么避:每个法律术语后面加括号解释,比如“撤销权(指合同一方有权解除合同)”。同时把核心结论挪到标题和第一段,别让AI去猜。 -
坑:律师资质页面用图片展示,没做结构化数据
律师执业证号、擅长领域全塞在JPG里。后果:Google搜索“北京离婚律师推荐”,AI摘要直接引用别家站的列表,我的站连片段都不显示。
怎么避:用Schema标记Person和LegalService类型,把律师姓名、执业证号、案例URL写成JSON-LD。核子GEO的AEO评估报告显示,加上结构化后AI引用率从0%跳到7.2%。 -
坑:地区页URL用了拼音,没统一成数字ID
比如“beijing-lvshi”和“bj-lvshi”并存,导致百度认为重复页面。后果:北京站的内链权重被稀释了40%,排名从第3页掉到第7页。
怎么避:统一用数字ID,比如“/lawyer/101”对应北京站,同时做301跳转处理旧URL。宝塔面板用Nginx rewrite搞定,花了2小时配置。 -
坑:没给AI引擎准备摘要元数据
meta description全是空的,或者只写“专业律师团队”。后果:ChatGPT抓取时随机摘取页面中段文字,经常抓到“咨询费”这类无关内容。
怎么避:每个页面写100-150字符的description,包含地域、业务类型、核心数据(比如“胜诉率89%”)。我用核子GEO批量检测了300个页面,发现87%的description不合格,连夜改完。 -
坑:链接交换只盯着法律同行
我找了10个律师站换友情链接,结果对方全是垃圾站,被百度降权。后果:我的站也被拖下水,核心词“离婚财产分割”从第2页掉到第8页。
怎么避:只换给政府部门(gov.cn)、高校法学院(edu.cn)、或法院官网。非法律类但权威的站(比如本地信息港)也行,但必须看对方真实流量。 -
坑:以为做好内容就行,没监控AI引用情况
我埋头写了2个月文章,结果发现文心一言和ChatGPT根本不提我的站。后果:招生季流量只涨了12%,远低于预期。
怎么避:每周用核子GEO跑一遍AEO检测,看AI引用率和引用来源。发现某个案由页被引用后,立刻把相关长尾词优化进标题,把优势扩大。