从 WordPress 5.5 开始,引入了一项新功能,将基本的、可扩展的XML 站点地图功能添加到 WordPress核心。在默认情况下,它仅提供URL(loc)标记,所以很多站长认为它过于简单而使用其它插件替代,本文将介绍如何免插件自定义 WordPress Sitemap ,以实现更完整的XML地图功能。
WordPress 自带的Sitemap地址为:/wp-sitemap.xml
站点地图 XML 格式概述
站点地图必须:
- 以开始标签开始,以结束标签结束:
<urlset></urlset>
- 在标签中指定命名空间(协议标准) 。
- 包括每个url的
<url>
条目,作为父XML标记。 - 为每个
<url>
父标记包含一个<loc>
子条目。
XML 站点地图示例:
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.zhanzhangb.com/</loc> <lastmod>2022-10-10</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> </urlset>
XML 标记定义
向 WordPress Sitemap XML 站点地图中添加其它标记
WordPress 自带的 Sitemap 虽然默认情况下很简单,但可以使用各种过滤器来完全自定义它。最终使它不亚于任何专业的XML生成插件。
如果网站文章或博客文章会偶尔更新,那么添加<lastmod>
标记非常重要,这会让搜索引擎知道URL对应的网页在什么时候做了修改。
/** 向Sitemap添加URL最后修改日期 教程:https://www.zhanzhangb.com/5073.html */ add_filter('wp_sitemaps_posts_entry', function( $entry, $post ) { $entry['lastmod'] = $post->post_modified_gmt; return $entry; }, 10,2 );
/** 向Sitemap添加URL页面内容更新频率 教程:https://www.zhanzhangb.com/5073.html */ add_filter('wp_sitemaps_posts_entry', function( $entry, $post ) { $entry['changefreq'] = 'Weekly'; //设置为每周更新,此处的值可根据需要修改 return $entry; }, 10,2 );
- always:每次
- hourly:每小时
- daily:每天
- weekly:每周
- monthly:每月
- yearly:每年
- never:从不更新
/** 向Sitemap添加URL页面的优先级 教程:https://www.zhanzhangb.com/5073.html */ add_filter('wp_sitemaps_posts_entry', function( $entry, $post ) { $entry['priority'] = '0.7'; //取值范围0.0 - 1.0 return $entry; }, 10,2 );
/** 向Sitemap添加 lastmod、changefreq、priority 标记 教程:https://www.zhanzhangb.com/5073.html */ add_filter( 'wp_sitemaps_posts_entry', function( $entry, $post ) { $entry['lastmod'] = $post->post_modified_gmt; $entry['changefreq'] = 'Weekly'; $entry['priority'] = '0.7'; return $entry; }, 10,2 );
从 Sitemap 中排除指定帖子
/** 从 WordPress Sitemap 中排除指定帖子 教程:https://www.zhanzhangb.com/5073.html */ add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) { if ( 'post' !== $post_type ) { return $args; } $args['post__not_in'] = isset( $args['post__not_in'] ) ? $args['post__not_in'] : array(); $args['post__not_in'][] = 123; // 123是要排除的帖子的ID。 return $args; }, 10,2 );
删除部分站点地图
默认情况下 WordPress Sitemap 会输出三种类型,帖子(含页面)、分类(含tag)和用户,如果要在Sitemap中删除某部分则也可以使用相应的过滤器来实现。
/** 从 WordPress Sitemap 中禁用部分列表 教程:https://www.zhanzhangb.com/5073.html */ //禁用作者列表 add_filter( 'wp_sitemaps_add_provider', function( $provider, $name ) { if ( 'users' === $name ) { return false; } return $provider; }, 10,2 ); //禁用page帖子类型的站点地图 add_filter( 'wp_sitemaps_post_types', function( $post_types ) { unset( $post_types['page'] ); return $post_types; } ); //禁用post_tag分类的站点地图 add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) { unset( $taxonomies['post_tag'] ); return $taxonomies; } );
修改地图索引中URL数量最大值
站点地图索引最多可包含 50000 个站点地图,单个站点地图最多可包含 2000 个(可过滤的)条目。
/** 将 WordPress Sitemap 单个xml文件中帖子URL的数量限制为1000 教程:https://www.zhanzhangb.com/5073.html */ apply_filters( 'wp_sitemaps_max_urls', 1000, 'post' );
额外提示:Yoast SEO 生成的 Sitemap 是不支持
和<changefreq>
标记的,因为 Google 已明确宣称这两个标记不如<priority>
<lastmod>
指定更新时间,但百度及其它搜索引擎目前是支持
和<changefreq>
标记的。<priority>
All in One SEO Pack Pro 与 Rank Math SEO PRO 的站点地图均支持
和<changefreq>
标记。<priority>