ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WordPress内置Sitemap定制指南:只留核心内容,提升抓取效率

WordPress内置Sitemap定制指南:只留核心内容,提升抓取效率 做WordPress站点的站长都知道内容能不能被搜索引擎收录第一步就是Sitemap。以前要么装个插件要么到处找在线生成工具。WordPress 5.5 开始内置了 Sitemap 功能直接在站点根目录给你生成 wp-sitemap.xml省心是省心但用段时间你就会发现默认配置可不管你的站哪个页面重要、哪个页面是凑数的所有公开的文章、页面、分类、标签、作者归档一股脑全列进去。于是尴尬局面就来了搜索引擎的抓取配额被一堆低价值页面白白消耗真正需要优先处理的核心内容反而排在后面。这篇就是来解决这个问题的。我会把 WordPress 内置 Sitemap 的机制拆开讲清楚然后给你一套完整的定制方案让你根据自己的站点类型只把真正重要的核心内容交给搜索引擎。不管你是个人博客、企业官网还是内容站这套思路都适用代码也直接可以抄。1. 为什么要定制 Sitemap默认配置的三个盲区1.1 内置 Sitemap 出现后为什么大家还是得动手WordPress 5.5 之前站点地图基本被第三方插件垄断。Yoast SEO、Rank Math 这类插件把 Sitemap 当作标配功能还有一堆专门的 Sitemap 插件。插件多了就出问题生成慢、配置项冗余、更新不及时很多站点还因为 Sitemap 插件和缓存插件冲突导致提交后内容迟迟不更新。5.5 版本内置的 Sitemap核心目标是让所有 WordPress 站点开箱即用地拥有一个符合规范的 XML Sitemap。它默认在 /wp-sitemap.xml 输出索引文件再按内容类型拆分成多个子文件比如 wp-sitemap-posts-post-1.xml、wp-sitemap-posts-page-1.xml、wp-sitemap-taxonomies-category-1.xml、wp-sitemap-users-1.xml。打开 wp-sitemap.xml你看到的是一个 Sitemap 索引搜索引擎会顺着索引去抓取每个子文件。这个设计本身挺聪明按类型分组、按数量分页不会让一个文件一次性输出成千上万条 URL。每个子文件默认最多放 2000 条链接超大站点也能正常展开。但问题也出在“默认”两个字上它不区分内容价值把所有公开可见的内容都当成同等重要的页面去推送这对大多数站点来说反而是一种负担。1.2 默认 Sitemap 会把哪些“库存”交出去拿一个典型的 WordPress 博客举例默认 Sitemap 会包含的东西比你以为的要多得多所有已发布的文章哪怕其中一半是旧闻和转载内容所有页面包括隐私政策页、登录页、测试页、低质量落地页所有分类归档页无论这个分类有没有真实搜索量所有标签归档页标签的数量经常比文章还多所有作者归档页哪怕某个作者只写过两篇文章所有附件页和 PDF、图片附件这些通常没有任何直接收录价值这些内容全部塞进 Sitemap最直接的后果就是抓取预算被稀释。搜索引擎给每个站点的抓取配额是有限的尤其中小型站点配额本来就不大。假设你的站有 100 个 URL里面有 30 个是标签页、作者页这种低价值页面那真正能用来抓核心内容的比例就只剩 70%。更麻烦的是标签页和分类页之间经常产生重复内容搜索引擎会花时间判断哪个版本是主体本来一分钟能抓完的事情可能要花三分钟去消重。我在一个实际案例里见过文章只有 500 篇的站点默认 Sitemap 展开后居然有 4000 多个 URL绝大多数是标签归档和按月归档页面。这种状态下核心文章在搜索引擎眼里全是噪音排名自然起不来。1.3 一言不合就删先定义你的核心内容列表“只让搜索引擎抓核心内容”这句话听起来简单落地之前你得先想清楚什么对你来说才是核心。不同站点的答案完全不一样个人博客核心是单篇博文分类页可以酌情保留标签页和作者页基本都是噪音企业官网核心是产品页、服务页、转化落地页新闻动态可留一个栏目附件和作者页建议直接关闭内容聚合站核心是内容详情页分类和聚合页需要精细设计不能全放也不能全不放电商站点核心是商品页、分类页博客上发的内容和标签要严格控制数量判断标准就三条这个页面有没有独立的搜索流量价值有没有被用户搜索后访问的可能有没有转化功能。三样全不沾就不该出现在 Sitemap 里。你不需要靠 Sitemap 告诉搜索引擎“我全站都是宝”Sitemap 的本质是“重点推荐清单”不是全站目录大集合。2. 定制前的核心思路少即是多还是够用就好2.1 动手前先想清楚定制 Sitemap 的三条原则我在给企业和个人站做这类优化时一般会遵循三条原则。第一条能砍就砍砍完再谈优化。先排除那些明显没有 SEO 价值的类型比如附件、作者归档、按日按月的归档页。这些页面就算被收录访问路径也很深几乎没有自然流量。砍掉之后搜索引擎的抓取效率会立刻改善核心内容的平均抓取频率也会上来。第二条保留动态更新能力。站点内容是在不断变化的新文章发布要能自动进入 Sitemap修改文章后 lastmod 要能更新。定制要基于 WordPress 的过滤器机制而不是手动维护一份固定 URL 列表。很多人图省事拿工具导出一个静态 XML 传上去过俩月忘了传搜索引擎索引彻底停摆这种方案不可取。第三条可回滚、可审计。所有改动要集中在一个地方比如子主题的 functions.php 或者一个自定义插件里。出问题能立刻定位、一键还原。我最怕的就是代码东改一块西改一块最后根本理不清 Sitemap 里为什么多了一个奇怪的 URL。2.2 代码定制 vs 插件为什么我站代码这边市面上很多 Sitemap 类插件配置页面做得很好看点几下鼠标就完事。但放到“内置 Sitemap 定制”这个场景下我反而更推荐直接上代码。原因不难理解。第一内置 Sitemap 本身就是轻量的你再装一个插件就多了一套配置、一个数据库存储表、一堆计划任务这和内置功能的初衷背道而驰。第二插件不会把你想要的每种过滤条件都做成开关一旦遇到“这个分类下的文章排除那个页面保留”这种需求你还是得写代码。第三代码方式更容易做版本管理改了什么拉一个 git diff 清清楚楚插件里点出来的配置隔两个月你自己都忘了当初为什么这么设。代码放哪里也值得说一句。如果只是临时调整放进子主题的 functions.php 就行。我更推荐放自定义插件里这样换主题时 Sitemap 配置不会跟着丢掉尤其适合那些频繁改版但 SEO 配置要保持稳定的站点。关于这个话题第 5 部分我还会细说。2.3 这些过滤器是定制 Sitemap 的基本武器定制内置 Sitemap核心就是踩准 WordPress 提供的过滤器。把这些钩子记住比背一堆配置项有用得多。我整理了一个速查表过滤器作用生命周期wp_sitemaps_enabled控制内置 Sitemap 是否启用返回 false 可关闭请求早期wp_sitemaps_post_types控制哪些文章类型进入 Sitemap可去掉某个类型构建索引时wp_sitemaps_taxonomies控制哪些分类法进入 Sitemap可去掉 tag 或 category构建索引时wp_sitemaps_add_provider控制 Sitemap 提供者注册可移除 users 等提供者初始化时wp_sitemaps_max_urls控制每个 Sitemap 子文件的 URL 数量上限分页计算时wp_sitemaps_posts_query_args控制文章类型查询参数可排除指定文章、按条件筛选生成文章列表时wp_sitemaps_taxonomies_query_args控制分类法查询参数可排除指定分类、标签生成分类列表时wp_sitemaps_users_query_args控制作者归档查询参数可排除指定作者生成用户列表时这里要特别提醒一句这些过滤器全部依赖 WordPress 5.5 及以上版本的内置 Sitemap 类。如果你还在用老版本建议先升级再操作或者老老实实用第三方插件不要在旧版本上硬套这些钩子否则直接白屏的错误你够喝一壶的。3. 实操一步步定制只留核心内容3.1 第一步先检查 wp-sitemap.xml 当前输出状态动手之前先访问一下你站点的 /wp-sitemap.xml确认内置 Sitemap 已经在正常输出。正常情况下浏览器里打开的应该是一个 XML 索引文件里面列出一堆子 Sitemap 的链接比如 wp-sitemap-posts-post-1.xml、wp-sitemap-taxonomies-category-1.xml 这些。如果直接 404先别急着写代码。去后台“设置 - 固定链接”里点一下保存让伪静态规则重新生成大多数情况下这样就能恢复。如果站点用的是 Nginx还要检查伪静态配置里有没有把 wp-sitemap.xml 这类 XML 文件当作静态文件处理掉这个问题我后面会详细说。确认 Sitemap 正常后再对照检查它输出了哪些内容类型。这一步一定要做因为很多站点之前装过其他 Sitemap 插件插件可能已经把内置 Sitemap 禁用了。你花大半天找过滤器为什么不生效结果发现调的根本不是当前这个生成器那就浪费时间了。3.2 第二步从内容类型里砍掉低价值项默认 Sitemap 里文章类型和分类法都处于“全量输出”状态。最直接的优化就是先把低价值类型从 Sitemap 里摘掉。比如一个普通博客文章是核心页面里可能只有 “关于我”“联系我” 这种少数几个页面有用分类页如果是为了聚合权重可以保留标签页、作者归档、附件页就都应该排除。代码如下// 控制输出到 Sitemap 的文章类型 add_filter(wp_sitemaps_post_types, function ($post_types) { // 保留 post 和 page其他类型全部移除 unset($post_types[attachment]); // 有自定义文章类型的按需解除注释 // unset($post_types[product]); return $post_types; }); // 控制输出到 Sitemap 的分类法 add_filter(wp_sitemaps_taxonomies, function ($taxonomies) { // 移除标签 unset($taxonomies[post_tag]); // 如果需要移除分类页把下面这行注释去掉 // unset($taxonomies[category]); return $taxonomies; }); // 移除作者归档 Sitemap add_filter(wp_sitemaps_add_provider, function ($provider, $name) { if (users $name) { return false; } return $provider; }, 10, 2);把这段代码加到子主题 functions.php 或者自定义插件里刷新 /wp-sitemap.xml你会看到子 Sitemap 文件数量直接少了一大批。wp-sitemap-users-1.xml 不再出现标签和附件的分页也从索引中消失。这就是“只留核心内容”的第一层收口。3.3 第三步按 ID 和条件排除个别 URL全局排除之后还剩一类需求某个类型整体保留但个别低价值条目不想出现在 Sitemap 里。这个就要动用查询参数过滤器了。比如文章列表里想排除几篇指定文章可以用 wp_sitemaps_posts_query_argsadd_filter(wp_sitemaps_posts_query_args, function ($args, $post_type) { // 只对 post 文章类型生效 if (post $post_type) { $args[post__not_in] array(120, 350, 888); } // 如果是 page 类型也可以单独排除页面 if (page $post_type) { $args[post__not_in] array(2, 5); // 比如隐私政策、登录页 } return $args; }, 10, 2);这里用的是 WP_Query 的标准参数 post__not_in很稳。需要提醒的是ID 列表一定要自己在后台先确认不要拍脑袋写。我踩过这个坑当时把一个重要落地页的 ID 手误写进了排除列表等搜索引擎把那页从索引拿掉之后流量掉了一半排查两天才发现是 Sitemap 干的好事。如果是想排除某个作者归档用 wp_sitemaps_users_query_argsadd_filter(wp_sitemaps_users_query_args, function ($args) { $args[exclude] array(2, 5); return $args; });如果想达到“某个分类下的文章一律不进 Sitemap”这种更复杂的条件可以在 posts_query_args 里加 tax_queryadd_filter(wp_sitemaps_posts_query_args, function ($args, $post_type) { if (post $post_type) { $args[tax_query] array( array( taxonomy category, field term_id, terms 15, operator NOT IN, ), ); } return $args; }, 10, 2);tax_query 的运算复杂度比 post__not_in 高文章数量大的站点会稍慢一点但 Sitemap 本身可以走缓存整体影响不大。我建议把这一步放在第三阶段做先把大窟窿堵上再处理个别问题否则上来就写一堆排除条件后期根本不知道哪条规则生效了。3.4 第四步控制子文件 URL 数量别让分页膨胀WordPress 默认每个子 Sitemap 最多写入 2000 条 URL。对大多数站点来说这个值偏大。子文件太大搜索引擎解析时间就长分页之间的抓取请求也会更密集。更合理的做法是把上限调低到 1000 以内让每次抓取都能在较短时间内读完。add_filter(wp_sitemaps_max_urls, function ($max_urls) { return 600; });数量定多少合适要看站点内容量。1000 篇以内的站点设 200 就够了5000 篇以上的建议 500 到 1000 之间。不用追求一次性全暴露搜索引擎本来就会分批抓Sitemap 是引导不是倒灌。这里有个细节值得说一下wp_sitemaps_max_urls 调整后分页数量会自动变化。比如默认 2000 时3000 篇文章分成 2 个分页改成 600 后会分成 5 个分页。最终搜索引擎会顺着 Sitemap 索引找到所有分页不影响完整收录只是文件数量变多、每个文件变小抓取节奏会更平滑。3.5 第五步用 robots.txt 给抓取规则兜底Sitemap 告诉搜索引擎“这些是重点”robots.txt 告诉搜索引擎“那些不要碰”。两个配合起来才能把“只抓核心内容”做到位。很多从 Sitemap 里排除掉的页面仍然可能通过站内链接、外链被搜索引擎发现。与其让它们从别的入口钻进来不如直接在 robots.txt 里声明不要抓取。用代码添加规则不依赖物理文件最省事add_filter(robots_txt, function ($output, $public) { if (false $public) { return $output; } $output . Disallow: /tag/\n; $output . Disallow: /author/\n; $output . Disallow: /?s\n; return $output; }, 10, 2);注意如果你的固定链接结构里没有 /tag/ 这种目录前缀这段规则就不会匹配需要改成实际路径。胡乱写 Disallow 的后果比不写更糟轻则规则失效重则误伤正常栏目。写完规则后去 /robots.txt 页面上肉眼确认一遍再上线这个动作别省。3.6 完整可用的定制代码示例把前面几段合成一个完整方案放在子主题 functions.php 或自定义插件里即可。核心代码大概是这样// 1. 关闭可关闭的内容类型 add_filter(wp_sitemaps_post_types, function ($post_types) { unset($post_types[attachment]); // 按需保留其他类型 return $post_types; }); // 2. 关闭标签分类法的 Sitemap add_filter(wp_sitemaps_taxonomies, function ($taxonomies) { unset($taxonomies[post_tag]); return $taxonomies; }); // 3. 移除作者 Sitemap add_filter(wp_sitemaps_add_provider, function ($provider, $name) { if (users $name) { return false; } return $provider; }, 10, 2); // 4. 排除指定文章和页面 add_filter(wp_sitemaps_posts_query_args, function ($args, $post_type) { if (post $post_type) { $args[post__not_in] array(120, 350); } if (page $post_type) { $args[post__not_in] array(2, 5); } return $args; }, 10, 2); // 5. 控制每个 Sitemap 子文件最大 URL 数量 add_filter(wp_sitemaps_max_urls, function ($max_urls) { return 600; });这段代码我在多个站点上实际跑过稳定可靠。但每个站点的固定链接结构、内容类型、插件环境都不同直接搬过去多少要微调。尤其是第 3 段如果你站点本身没开作者归档或者作者页早就被其他规则限制访问了那这一段也可以不写。4. 常见问题与排查技巧实录4.1 代码加了没生效按这个顺序从外到内排查代码生效的前提是代码被执行。很多人把函数扔进主题的 functions.php然后清一遍缓存发现没用就开始怀疑钩子名字是不是写错了。其实第一批该怀疑的是这段代码所在的主题是否真的被加载了以及有没有别的插件抢先改过同一个过滤器。我自己排查的顺序是这样的先打开 /wp-sitemap.xml看问题是否还存在再检查钩子函数名有没有拼错注意 wp_sitemaps_post_types 中间是复数的 s然后看站点是否启了缓存Sitemap 页面很可能被缓存插件或 CDN 缓存了改了代码后必须同时清掉页面缓存、对象缓存和 CDN 缓存再看。如果以上都排查完还没生效最后再看优先级。所有过滤器的默认优先级都是 10如果一个插件用优先级 5 修改了同一个过滤器你的代码就会在它之后执行返回值也可能被覆盖。这种隐性冲突最难查但通常你只要把函数的优先级改成 20 或 30就能绕过去。4.2 Sitemap 404 和 500 的分场景处理内置 Sitemap 输出依赖 WordPress 重写规则。出现 404第一步去“设置 - 固定链接”页面里不做任何修改直接保存一次让重写规则刷新。这个操作能解决一大半问题。如果刷新后还是 404说明服务器层面的伪静态可能拦掉了 wp-sitemap.xml 这个路径。Nginx 下常见问题是把 wp-sitemap.xml 错误地当成静态文件请求没转给 WordPress 处理。处理方式是把 Sitemap 相关路径从静态匹配里排除或者直接让该路径走 index.php 解析。500 错误相对少见多半是 PHP 内存或函数语法问题。刚写入函数后立刻 500基本就是 syntax error检查括号和分号。另一个可能是 WordPress 版本太低内置 Sitemap 类还不存在你调用的过滤器自然就会报致命错误。4.3 SEO 插件与内置 Sitemap 二选一别双开用 Yoast SEO 或 Rank Math 的站点有一个非常典型的冲突问题插件会默认接管 Sitemap 功能它们在各自设置里生成一套 Sitemap而 WordPress 内置的 Sitemap 也可能同时在输出。结果就是站点上存在两套 Sitemaprobots.txt 里还都声明了地址。两套 Sitemap 会提交大量重复 URL搜索引擎虽然能处理这种重复但没必要自己制造混乱。我的建议是二选一。如果你已经在用 SEO 插件直接在插件设置里启用插件自己的 Sitemap然后用插件工具禁用内置的反过来如果你觉得内置 Sitemap 已经够用就用代码关闭插件里的 Sitemap 功能让插件继续管 title、meta 那些事。判断当前是谁在输出 Sitemap最直接的办法是看 /wp-sitemap.xml 返回的到底是什么。如果打开之后跳转到了 sitemap_index.xml说明是 Yoast 在接管如果显示一堆分页链接的索引结构才是 WordPress 内置的输出。4.4 刚调完索引量下降是虚惊还是真问题这是个很容易让人惊慌的场景。改完 Sitemap去站长平台一看索引量降了立刻怀疑自己改坏了。其实大多数时候这是正常波动。你把几百个低价值 URL 从 Sitemap 里拿掉搜索引擎需要一段时间重新评估之前收录的低价值页面也会逐步清理索引量短期下行是很正常的。我做过记录的站点里一般两周左右会重新恢复稳定。判断有没有真改坏标准很简单看核心内容页面的抓取次数是否上升核心关键词的排名有没有正向变化核心页面的最终收录是否保留。只要这三项是好的索引总量降一点反而是健康信号说明搜索资源在向重点内容倾斜。4.5 用站长平台验证定制结果验证分两步。第一步看 Sitemap 本身打开 wp-sitemap.xml 和各个子文件确认排除的内容已经不在列表里保留的内容数量符合预期。第二步看站长平台数据在常用的搜索站长工具里重新提交 Sitemap 地址然后关注抓取统计维度的变化重点观察核心页面的抓取量和平均抓取间隔。这里顺带说一个小技巧Sitemap 改完后不一定非要立刻手动提交。让搜索引擎自然抓取一两天再去看效果比频繁提交更能反映真实状态。反复改 Sitemap 然后反复提交反而容易让抓取周期变乱搜索引擎会认为这个站的 Sitemap 不稳定从而降低抓取优先级。5. 实操心得几个帮你少走弯路的建议5.1 代码放哪里直接影响后续维护成本一开始我就说了Sitemap 定制代码不要直接扔进父主题。父主题一升级改动全没。放进子主题的 functions.php 是基础操作更稳妥的是做成一个站点专属功能插件把 Sitemap 定制和站点自己的 SEO 调整放一起。这样哪怕换主题这些规则仍然在跑不会出现 Sitemap 突然变回全量默认状态的意外情况。我见过不少站点改版后 Sitemap 里的 URL 数量突然暴涨一倍就是因为之前写在旧主题里的过滤代码随着主题更换全部失效了。把这些逻辑从主题里剥出来放到独立插件里就是为未来省一次大坑。5.2 每一条过滤规则都要能说清来龙去脉代码写的时候恨不得越短越好但三个月后回来看完全想不起来当初为什么要排除第 120 号文章为什么要单独保留某个分类页。这种事情我经历太多次了。现在我要求自己在每段过滤函数前面加注释写清楚这条规则是干嘛的、为哪个需求加的、什么时候加的。这不算多余这个习惯救了我很多次。如果你的站点不是只有你一个人维护那这个习惯更需要。团队协作时约定 Sitemap 这类 SEO 相关代码必须带更新说明能避免大量无效沟通和重复排查。5.3 每季度回访一次 Sitemap 配置站点不是一成不变的。今天内容下线、明天换页面结构、后天可能新增一个自定义文章类型这些都会影响 Sitemap 的实际输出。我给自己定的节奏是每季度检查一次看看有没有新主题带出奇怪的内容类型、有没有新插件偷偷注册了 Provider、有没有哪个分类本来没价值现在价值反而变大。检查方法很简单打开 wp-sitemap.xml 看分页数量再用站长工具的抓取报告对比上一周期数据。如果分页数量突然多了多半有新的内容类型被纳入了 Sitemap这时就要回到第 3 部分的代码里决定是保留还是排除。这个过程不复杂但勤快一点能让你始终处于主动位置。如果只让我说一条最重要的经验那就是Sitemap 一直是给搜索引擎看的导航地图不是全站流水账。每天新增了哪些页面不重要重要的是桌上那几道硬菜必须端到明面上。WordPress 内置 Sitemap 的定制本质上是一次“删繁就简”把抓取预算从碎片页面里抢回来还给真正能带来流量和转化的内容。别怕删掉那些看似热闹的标签页和作者页过两周看数据你会庆幸自己做了这个决定。
返回列表