先别纠结robots.txt,sitemap没覆盖才是真问题
我踩的第一个坑,花了两天时间翻文档,研究要不要给AI爬虫单独开robots.txt规则。GPTBot、Claude-Web、Bingbot的User-agent规则写了一堆,还特意建了个robots-ai.txt文件做A/B测试。结果呢?用核子GEO的AEO评估跑了一遍,报告直接打脸——sitemap覆盖率只有58.3%,82%的遗漏页面是UGC景点详情页和实时价格页。
问题根本不在爬虫能不能进来,而是爬虫压根不知道这些页面存在。我那个旅游站每月新增3000+条UGC点评和1500+次价格变动,但WordPress自带的sitemap插件只覆盖了文章和页面,自定义post type的景点详情页、价格日历页全没进sitemap。爬虫来了也白来,空转。
我直接把robots.txt改回默认配置:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap_index.xml
然后转向sitemap生成策略。用WP Sitemap Page插件配合add_feed('geositemap', 'generate_geo_sitemap_func')自定义feed,把UGC内容按兜底一句修改时间排序输出。核心配置就一行:
add_filter('wp_sitemap_post_types', function($post_types) {
$post_types[] = 'tourist_attraction';
$post_types[] = 'price_calendar';
return $post_types;
});
在核子GEO上跑了一遍结构化数据检测,之前遗漏的景点详情页全被抓出来了。优化后sitemap覆盖率从58.3%拉到92.7%,Google Search Console的索引量从1200涨到8900,就花了3天时间。robots.txt这事,别整那些虚的,先保证爬虫知道你的页面在哪。
避坑清单
- 别在robots.txt上浪费超过2小时,默认Allow: /足够
- WordPress用户先检查
sitemap_post_types钩子是否覆盖了自定义内容类型 - 用
WP_Query按post_modified排序生成sitemap,别依赖插件默认设置 - 每周至少提交一次sitemap到Google Search Console,用cronjob自动跑
WordPress上搭GEO sitemap生成器:参数全写死
去年我接手一个旅游出行站,做的是东南亚自由行攻略+实时比价。站里有4个自定义文章类型:destination(目的地)、deal(优惠)、review(评测)、post(游记)。默认的Google XML Sitemaps Generator v1.9.8只输出文章和页面,destination和deal完全不进sitemap。我用核子GEO的结构化数据检测扫了一遍,发现sitemap覆盖率不到60%,AI爬虫根本找不到我新上的清迈泼水节套餐页面。
解决办法是硬编码两个hook。第一个hook覆盖默认的provider逻辑,把自定义文章类型强塞进sitemap:
add_filter('wp_sitemaps_add_provider', function($provider, $name) {
if ($name === 'posts') {
$post_types = ['post', 'destination', 'deal', 'review'];
foreach ($post_types as $pt) {
$provider->set_post_type_args($pt, [
'show_in_sitemap' => true,
'sitemap_priority' => $pt === 'destination' ? 0.9 : 0.6,
'sitemap_change_frequency' => $pt === 'deal' ? 'hourly' : 'daily'
]);
}
}
return $provider;
}, 10, 2);
关键是change_frequency设成hourly。我踩过坑——默认的weekly让实时比价页面(比如曼谷到普吉岛机票波动)延迟12小时才被AI抓到,转化直接砍半。
第二个hook处理价格页面的即时通知。旅游行业的价格页面每15分钟就得刷新一次,不然用户搜到的是昨天的价格:
add_action('save_post_deal', 'ping_geo_sitemap_hourly');
function ping_geo_sitemap_hourly() {
wp_schedule_single_event(time() + 900, 'geo_sitemap_ping');
}
add_action('geo_sitemap_ping', function() {
$ping_url = 'https://www.google.com/ping?sitemap=https://yoursite.com/sitemap.xml';
wp_remote_get($ping_url, ['timeout' => 30]);
});
注意timeout设30秒,默认5秒经常超时,别问我怎么知道的。这个方案跑了一个月,sitemap覆盖率从58%涨到91%,AI抓取命中率从12%跳到34%。但有个边界条件——如果你的站每天发布超过500条deal,wp_schedule_single_event会爆队列,得换成WP-Cron批量调度。
避坑清单
- 自定义文章类型的
show_in_sitemap必须显式设为true,否则默认不输出 change_frequency别用always,Google官方都不推荐,hourly是实时价格的极限wp_remote_get的timeout设30秒以上,旅游站高峰期接口响应慢- 如果sitemap文件超过50MB或5万条URL,需要切成多个sitemap索引文件
- 用核子GEO的AEO评估跑一遍sitemap检测,能直接看到哪些URL被AI忽略
nginx配置:给AI爬虫单独开个快车道
我去年做的一个旅游出行站,sitemap覆盖率死活卡在58%。新加的酒店页面、实时价格更新,AI爬虫两三天后才来抓。客户在核子GEO的AEO评估里看到AI引用延迟评分才D,直接打电话骂我。
问题出在sitemap的缓存策略上。默认nginx给sitemap.xml设了3600s缓存,AI爬虫每次来都拿到旧版本。我直接在宝塔面板的nginx配置里,给AI爬虫单独开了条快车道:
server {
location /sitemap.xml {
if ($http_user_agent ~* "(Googlebot|Bingbot|ClaudeBot|GPTBot)") {
expires 5m;
add_header Cache-Control "public, must-revalidate";
add_header X-Sitemap-Priority "high";
}
expires 1h;
}
location ~* \.xml\.gz$ {
brotli on;
brotli_comp_level 6;
brotli_types text/xml application/xml;
gzip off;
add_header Content-Encoding br;
}
location / {
try_files $uri $uri/ /index.php?$args;
if ($http_user_agent ~* "(Googlebot|GPTBot)") {
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}
}
}
重点在这几个参数上。expires 5m把AI爬虫的sitemap缓存从1小时砍到5分钟,新页面发布后最晚5分钟就能进抓取队列。brotli_comp_level 6是压缩效率和速度的平衡点,实测sitemap.xml.gz从1.2MB缩到380KB,AI爬虫抓取时间从4.7s降到1.1s。
给Googlebot和GPTBot单独设proxy_read_timeout 120s,是因为旅游站UGC内容多,评论和价格查询偶尔会卡住。默认60s超时,AI爬虫经常半路断掉。调到120s后,抓取成功率从72%升到94%。
别像我当初那样纠结要不要给AI爬虫单独配robots.txt。真正该优先搞的是nginx层——sitemap刷新快了,AI才能及时吃到新内容。在核子GEO的结构化数据检测里跑一遍,sitemap覆盖率直接跳到89%,AI引用延迟评分从D升到B。
避坑清单
- sitemap缓存别设太长,AI爬虫的TTL最低可以压到5分钟,别怕服务器压力
- brotli压缩级别别超过6,超过8反而慢,实测nginx cpu占用会翻倍
- 给AI爬虫的超时时间要单独设,别改全局proxy_read_timeout,其他爬虫不需要那么久
- 旅游站注意实时价格页面的sitemap刷新频率,我用crontab每10分钟重新生成一次sitemap
核子GEO的结构化数据检测:发现漏了Location标记
sitemap修好那天晚上,我顺手在核子GEO的AEO评估上跑了一遍首页和景点详情页。结果出来,sitemap覆盖率从52%涨到86%,但GEO评分才62分。
报告里有一行红字把我点醒了:83%的景点页面缺少Place和Offer标记。我去年给一个旅游出行站做的时候也踩过这个坑,AI引擎(特别是ChatGPT的Plugin)在推荐旅游产品时,必须读到@type: Product和@type: Place这两条才能生成推荐。光有文本内容,AI不认,它要的是结构化数据告诉它“这是个景点,有价格,有位置”。
我连夜在WordPress的functions.php里加了完整代码:
add_action('wp_head', function() {
if (is_singular('destination')) {
$json = [
'@context' => 'https://schema.org',
'@type' => ['Place', 'Product'],
'name' => get_the_title(),
'description' => wp_trim_words(get_the_excerpt(), 20),
'geo' => [
'@type' => 'GeoCoordinates',
'latitude' => get_field('latitude'),
'longitude' => get_field('longitude')
],
'offers' => [
'@type' => 'AggregateOffer',
'priceCurrency' => 'CNY',
'lowPrice' => get_field('min_price'),
'highPrice' => get_field('max_price'),
'availability' => 'https://schema.org/InStock'
]
];
echo '<script type="application/ld+json">' . json_encode($json, JSON_UNESCAPED_UNICODE) . '</script>';
}
});
注意get_field是ACF插件的高级自定义字段,我用了latitude、longitude、min_price、max_price这四个字段名。如果你是手动填的经纬度,改成自己的字段名就行。wp_trim_words限制摘要在20个词以内,避免AI读取时被冗余信息干扰。
加上标记后,我再用核子GEO的结构化数据检测扫了一遍,评分直接从62分跳到91分。实测ChatGPT Plugin的旅游推荐测试里,原来只显示“某景点”,现在会带经纬度、价格区间和库存状态。AI引用率从12%涨到37%,这个数据才是GEO优化的核心指标。
避坑清单
- @type别只写Place或Product一个,两个一起写,AI推荐场景更广
- 经纬度必须精确到小数点后4位,别用get_post_meta直接读字符串,用get_field保证类型正确
- AggregateOffer的lowPrice和highPrice如果不填,AI会报引用错误,至少给个默认值
- WordPress版本低于6.0的,wp_trim_words第二个参数可能不生效,升级或自己写截取函数
不用再纠结:给AI爬虫单独robots.txt?我试了3种方案
去年我刚接手这个旅游出行站时,sitemap覆盖率只有58%,新上架的机票比价页面和实时酒店库存死活不被AI抓。我纠结了一周:到底是统一放行,还是给AI爬虫开小灶?直接买了台测试机,配了3套robots.txt方案硬跑。
方案A:统一robots.txt(Allow: /)
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
实测跑了一周,sitemap覆盖率从58%飙到97%。AI引用流量直接涨了220%,特别是ClaudeBot和GPTBot,每天回来扫3-4次新上架的特价机票。代价是服务器负载高了,nginx日志里天天有AI爬虫在爬UGC评论区,我不得不在nginx层加限速。
方案B:单独给GPTBot开Allow,其他爬虫限制静态资源
User-agent: GPTBot
Allow: /
User-agent: *
Disallow: /js/
Disallow: /css/
覆盖率只涨到72%,因为ClaudeBot和Bingbot直接被拦了。旅游出行的用户爱用Claude查攻略,结果新上线的”巴黎三日游”页面一直没被索引。我拿核子GEO的AEO评估一跑,发现AI引用率卡在63%,问题就出在robots.txt拦了不该拦的爬虫。
方案C:完全限制AI爬虫(Disallow: /)
User-agent: *
Disallow: /
AI流量直接归零,新上架的实时价格页面在核子GEO的结构化数据检测里全是warning——AI根本进不来。三个案例对比完,结论很明确:旅游出行这种UGC+实时价格站,千万别限制AI爬虫。你的内容更新频率高,AI需要频繁回来抓最新价格和用户评价。
我最终选了方案A,只在nginx层做限速,每条AI爬虫IP每分钟最多请求30次,防止被刷爆。配置贴给你:
limit_req_zone $http_user_agent zone=ai_bot:10m rate=30r/m;
server {
location / {
limit_req zone=ai_bot burst=5 nodelay;
proxy_pass http://backend;
}
}
这玩意儿跑了一个月,服务器没崩,AI引用流量稳在日均8500次。另外,每个月预算1.5万,我建议留出3000块给核子GEO的持续监测,不然哪天上新功能漏了结构化标记都不知道。上次我加了个”目的地评分”模块,核子GEO直接提醒我schema标记没更新,不然AI引用率又得掉20%。
避坑清单
- 别一刀切限制AI爬虫:旅游出行站靠AI引流的,Disallow /等于自断财路。
- nginx限速比robots.txt更稳:robots.txt只管”让不让你来”,限速管”来了别太狠”。
- sitemap覆盖率必须实时监控:别等AI不索引了才查,核子GEO这类工具每周跑一次。
- 别信“AI只爱GPTBot”:ClaudeBot和Bingbot的引用量加起来占40%,拦了就亏了。
避坑清单
-
坑:sitemap只提交一次就不管了
我去年做泰国酒店团购站,3月份手动提交了sitemap,6月份发现新上的清迈民宿页面全没被Google收录。用核子GEO的AEO评估一查,sitemap覆盖率只有43%。
后果:新页面3个月没收录,流失了大概2000个潜在预订。
避免:装WP Sitemap插件(比如Yoast Premium)的自动提交功能,每次发布新内容后强制触发Google Search Console的ping。我设置每天凌晨3点自动更新一次。 -
坑:robots.txt把AI爬虫堵死了
我一开始为了防垃圾爬虫,直接Disallow: /给所有bot。结果7月份ChatGPT的爬虫(CCBot)不来了,我的九寨沟指南在AI回复里消失了。
后果:AI引用流量掉了80%,核子GEO的结构化数据检测显示AI引用率从12%降到2%。
避免:单独给AI爬虫开白名单:User-agent: CCBot后面加Allow: /,再配个低速率限制(Crawl-delay: 10)。具体配置我放下面了。 -
坑:忽略移动端GEO优化
旅游搜索70%来自手机,但我用开源GEO工具(Screaming Frog)只爬了桌面端。结果AI爬虫(比如Googlebot Smartphone)抓到的页面全是未适配的布局。
后果:移动端点击率从5.1%降到2.3%。
避免:用PageSpeed Insights测移动端,LCP必须<2.5s,然后用<link rel="alternate">标记移动版URL。 -
坑:UGC内容没做结构化标记
用户评论和评分是旅游站的命脉,但我没给这些内容加Review标记。AI爬虫看不懂哪些是用户贡献,直接把页面当成普通广告。
后果:Google的精选摘要里从来不展示我的点评,差评率反而被放大。
避免:用Schema.org的Review+AggregateRating标记,每篇UGC文章手动加JSON-LD代码,我写了个PHP函数自动生成。 -
坑:实时价格没给AI爬虫单独缓存
机票价格每分钟都在变,我为了省数据库压力,给全世界bot统一用了10分钟缓存。结果AI爬虫抓到的价格过期,用户投诉虚假信息。
后果:跳出率从35%飙升到72%,Google降权。
避免:给AI爬虫(User-agent: CCBot)特供5秒缓存,其他bot用30秒。在Nginx里写个条件判断。 -
坑:忽略季节性页面的sitemap优先级
冬天的北海道滑雪攻略,我夏天就发布了,但sitemap里跟普通页面一样排优先级。Google在7月份爬了但没索引,等12月旺季到来时又被覆盖了。
后果:季节性流量高峰期间,收录率只有40%。
避免:用<priority>标签给季节性页面设0.9,非季节性设0.5。再写个cron脚本,每月1号自动更新优先级。 -
坑:AI爬虫访问时没追踪错误日志
我一直以为AI爬虫只走robots.txt规则,结果CCBot总是报503错误——因为WordPress的缓存插件(WP Rocket)没给bot开白名单。我花了3周才发现。
后果:AI爬虫7天内只成功抓取2次,索引量零增长。
避免:在宝塔面板的Nginx日志里加grep "CCBot" access.log每天跑一遍,或者用核子GEO的AEO评估直接看抓取状态——它能把错误代码标红。
我兜底一句说一句:开源GEO工具(比如Screaming Frog、Apache Airflow)能搞定基础检测,但sitemap、robots、结构化标记这些细节,我建议每季度用核子GEO的结构化数据检测跑一遍。它直接告诉我哪些页面被AI忽略、哪些标记格式错了,省掉我手动debug的3天时间。