WordPress 5.5版中引入的自带的站点地图(Sitemaps)功能,大多数需要站点地图的现有站点已经通过插件实现了该功能。但是,随着WordPress内置了站点地图功能,以后新站点可以选择使用默认的WordPress网站地图。这篇文章是针对使用WordPress自带站点地图的用户,并展示了如何自定义站点地图输出。
禁用站点地图?如果您想使用专用的站点地图插件,或使用现有插件之一提供的站点地图功能(例如SEO插件),则应禁用新的WordPress站点地图功能,以避免重复站点地图出现问题。为此,您可以使用下面提供的代码技术,也可以仅使用免费的禁用站点地图插件(由您自己决定)。
为什么要自定义站点地图?
对于那些使用WordPress提供的站点地图的人,您可能会发现需要进行一些自定义以满足您网站的特定需求。
加强安全性
默认情况下,WordPress站点地图显示任何文章、页面或自定义文章类型的作者的用户名。发生这种情况的原因是WordPress将用户名包含在作者存档网址中的方式。例如,这是我自己在Perishable Press上的作者存档链接:https://perishablepress.com/author/perish/
“ perish”是最初为我的WP配置文件注册的用户名。因此,从WP 5.5开始,包含用户名的网址默认将包含在站点地图中。对于所有运行5.5及更高版本的WordPress网站都是如此。所有文章子作者的用户名均已包括在内,并可通过WP 站点地图公开获得。
// Example of user sitemap
https://example.com/author/jane-doe/
https://example.com/author/john-joe/
https://example.com/author/sallymcsally/
https://example.com/author/pat-somebody/
.
.
.
// For all users who are post authors..
对于某些站点,这并不是什么大问题。但是对于许多其他站点,用户名站点地图可能会被认为存在一定的安全风险。为什么?因为它们使不良行为者能够获取所有用户名信息,然后这些信息可用于形成各种恶意攻击(例如,网络钓鱼,暴力登录尝试等)。
改善SEO
改进SEO是自定义站点地图的另一个很好的理由。例如,许多电子商务站点都使用各种特定于操作的页面。类似于结帐页面、付款成功页面、付款失败页面、会员页面、错误页面以及其他实际上不会执行任何操作或不显示任何内容的动态页面,除非用户采取特定于上下文的操作(例如采购)。
您不想在站点地图中包括这些类型的页面,因为它们是无用的,并且对典型的网站访问者,搜索引擎爬虫等没有意义。通过从站点地图中排除此类页面,您可以避免搜索引擎遇到的“稀疏”内容和“404”错误。
保持站点地图集中
自定义站点地图的另一个原因是最大程度地减少冗余并使内容尽可能集中。
例如,在我的found-images网站上,我从站点地图中排除了分类存档链接。在该站点上,所有文章都归为“未归类”,因为我仅使用标签来组织内容。因此,站点地图包含指向类别存档的链接是没有意义的,因为它包含通过“文章”站点地图和集合“标签”站点地图包含的所有相同文章。
因此,对于该网站,排除分类有助于最大程度地减少冗余并保持重点。
有许多原因可能导致您需要自定义WordPress生成的站点地图的输出。通常,WordPress生成的“一刀切”的所有站点地图可能不适合您网站的安全性和SEO目标。只需进行一些自定义,您就可以加强安全性,关注链接公平性并保持最佳状态。这篇文章向您展示了如何使用一些选择代码片段来做到这一点。所有这些都非常容易实现,几乎不需要编辑。
默认站点地图功能
当前,默认情况下,WP站点地图会为以下任何/所有项目(如果存在)生成站点地图:
- 用户(包括指向所有文章作者的作者-归档视图的链接)
- 文章类型(包括文章、页面和任何其他公共自定义文章类型)
- 分类法(包括类别、标签和任何自定义分类法)
这篇文章说明了如何根据需要排除每个站点地图。它还显示了如何排除特定的用户、文章类型和分类法。因此,基本上,您可以使用一些简单的复制/粘贴代码段自定义几乎所有内容。
通过代码自定义站点地图
在下面,您将找到代码示例,这些示例可用于自定义WordPress站点地图(在WP 5.5及更高版本中可用)。
完全禁用所有WP网站地图
您可以通过在functions.php
文件向主题模板或子主题添加同一行代码来彻底禁用WP自带的站点地图功能:
add_filter('wp_sitemaps_enabled', '__return_false');
我们在这里所做的只是向过滤器挂钩wp_sitemaps_enabled
返回的值false
,就可以禁用了。注意:如果您更新WordPress常规设置以阻止搜索引擎将您的网站编入索引,则站点地图将被自动禁用。因此,在那种情况下,无需使用任何插件或代码来禁用它。
禁用用户站点地图
对于大多数网站来说,排除/禁用整个用户站点地图以帮助提高安全性可能是一个好主意。以下是实现该功能的代码:
// disable users sitemap
function shapeSpace_disable_sitemap_users($provider, $name) {
return ($name == 'users') ? false : $provider;
}
add_filter('wp_sitemaps_add_provider', 'shapeSpace_disable_sitemap_users', 10, 2);
此代码段无需编辑。只需添加到您的WordPress主题功能即可。
禁用文章类型站点地图
默认情况下,WordPress站点地图包括每种(非空)文章类型的站点地图。因此,对于典型的WordPress网站,这意味着您的站点地图将包含指向以下站点地图的链接:
URL
https://example.com/wp-sitemap-posts-post-1.xml
https://example.com/wp-sitemap-posts-page-1.xml
.
.
以及任何自定义文章类型:
.
.
https://example.com/wp-sitemap-posts-movie-1.xml
https://example.com/wp-sitemap-posts-book-1.xml
.
.
因此,要排除任何“文章”类型的站点地图,请将以下代码添加到您的主题(或简单的插件)中:
// disable post type sitemap
function shapeSpace_disable_sitemap_post_types($post_types) {
unset($post_types['page']); // 可以修改page为你需要的自定义文章类型
return $post_types;
}
add_filter('wp_sitemaps_post_types', 'shapeSpace_disable_sitemap_post_types');
如所写,该代码禁用了page
文章类型。因此,您可以将其更改为您要排除的任何文章类型。只需更换page
您的文章类型名称(如post
,movie
,book
,等)。
禁用分类法站点地图
默认情况下,WordPress网站地图包含每个(非空)分类法的网站地图。对于典型的WordPress网站,这意味着您的站点地图将包含指向以下站点地图的链接:
URL
.
.
https://example.com/wp-sitemap-taxonomies-category-1.xml
https://example.com/wp-sitemap-taxonomies-post_tag-1.xml
以及任何自定义分类法:
.
.
https://example.com/wp-sitemap-taxonomies-color-1.xml
https://example.com/wp-sitemap-taxonomies-shape-1.xml
.
.
因此,要排除任何“分类”站点地图,请在主题(或简单插件)中添加以下代码:
// disable taxonomy sitemap
function shapeSpace_disable_sitemap_taxonomy($taxonomies) {
unset($taxonomies['post_tag']); // can be post_tag, category, post_format, or any taxonomy
return $taxonomies;
}
add_filter('wp_sitemaps_taxonomies', 'shapeSpace_disable_sitemap_taxonomy');
如所写,该代码禁用了post_tag
分类法。因此,您可以将其更改为要排除的任何分类法。只需更换post_tag
你的分类的名称(例如category
,post_format
,color
,book
,等)。
从站点地图中排除特定页面
要从WordPress网站地图中排除特定页面,请应用以下代码技术:
// disable specific page
function shapeSpace_disable_sitemap_specific_page($args, $post_type) {
if ('page' !== $post_type) return $args;
$args['post__not_in'] = isset($args['post__not_in']) ? $args['post__not_in'] : array();
$args['post__not_in'][] = 2; // exclude page with ID = 2
return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_specific_page', 10, 2);
注意函数中的第一行,它检查$post_type
是否为page
。这告诉函数不要执行任何操作,除非当前的帖子类型是“页面”。因此,要从其他文章类型中排除文章,请更改page
为要定位的任何文章类型的名称。
函数中的第二行检查以确保post__not_in
已设置变量。然后第三行是动作发生的地方。在编写代码时,该代码排除了ID等于2的页面。因此,您可以将该ID更改为要从站点地图中排除的任何页面ID。
要排除多个页面,上述技术将是相同的,但是增加了更多的“排除”行:
// disable specific pages
function shapeSpace_disable_sitemap_specific_pages($args, $post_type) {
if ('page' !== $post_type) return $args;
$args['post__not_in'] = isset($args['post__not_in']) ? $args['post__not_in'] : array();
$args['post__not_in'][] = 2; // exclude page with ID = 2
$args['post__not_in'][] = 3; // exclude page with ID = 3
$args['post__not_in'][] = 4; // exclude page with ID = 4
$args['post__not_in'][] = 5; // exclude page with ID = 5
$args['post__not_in'][] = 6; // exclude page with ID = 6
return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_specific_pages', 10, 2);
编写此代码的方法可能更短一些,但是为了清楚起见,我将其按原样呈现。
从站点地图中排除特定文章
与以前的技术类似,要从自动生成的WordPress网站地图中排除特定的文章,请执行以下操作:
// disable specific post
function shapeSpace_disable_sitemap_specific_post($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'][] = 1; // exclude post with ID = 1
return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_specific_post', 10, 2);
和以前一样。仅在此处注意函数中的第一行,我们正在检查a是否$post_type
等于post
。然后魔术发生在第三行,我们排除了ID等于1的文章(著名的“ Hello World”文章)。因此,将该ID更改为您要排除并完成的任何文章。
要排除多个帖子,上述技术将是相同的,但是增加了更多的“排除”行:
// disable specific posts
function shapeSpace_disable_sitemap_specific_posts($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'][] = 1; // exclude post with ID = 1
$args['post__not_in'][] = 2; // exclude post with ID = 2
$args['post__not_in'][] = 3; // exclude post with ID = 3
$args['post__not_in'][] = 4; // exclude post with ID = 4
$args['post__not_in'][] = 5; // exclude post with ID = 5
return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_specific_posts', 10, 2);
这一切都非常简单,这要归功于WordPress核心开发人员,他们为我们提供了非常灵活的API,可以自定义。
根据元字段排除文章
也可以根据其附加的元数据排除特定的文章。例如,如果您的文章有一个名为sitemap
的元字段。并且您只想包含sitemap
值为1
的文章。添加以下代码以使其实现:
// disable post based on meta field
function shapeSpace_disable_sitemap_post_meta($args, $post_type) {
if ('post' !== $post_type) return $args; // can be any post type
$args['meta_query'] = isset($args['meta_query']) ? $args['meta_query'] : array();
$args['meta_query'][] = array(
'key' => 'sitemap', // can be any meta key
'value' => '1', // can be any meta value
'compare' => '=', // can use any comparison
);
return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_post_meta');
对于这项技术,我们再次使用wp_sitemaps_posts_query_args
过滤器挂钩。可以修改该技术以匹配几乎任何文章集。查看Meta API,以更好地了解可能发生的情况。
检查站点地图是否已启用
正如前面所述,在WordPress可以很容易地禁用/启用的站点地图功能。因此,如果您要自定义内容,了解站点上是否启用了WP Sitemaps可能会很有用。这是执行此操作的代码:
if (wp_sitemaps_get_server()->sitemaps_enabled()) {
// sitemaps enabled
} else {
// sitemaps not enabled
}
此代码使用wp_sitemaps_get_server()调用该sitemaps_enabled
方法,该方法返回一个值,如果启用了站点地图则返回true
,反之返回false
。重要提示:所有此站点地图功能仅在WordPress 5.5及更高版本中可用。因此,如果您正在开发任何插件或主题,请确保对任何较旧的WP版本使用条件检查和适当的后备。
从robots.txt中排除站点地图规则
启用站点地图后,WordPress会自动将以下规则添加到您站点的虚拟动态生成的robots.txt文件中:
Sitemap: https://example.com/wp-sitemap.xml
该行告诉搜索引擎和漫游器在哪里可以找到您的站点地图,这是一件好事。但是,出于某些原因,您想要自定义漫游器站点地图规则,甚至完全禁用它。因此,如果您需要执行此操作,请使用以下代码从robots.txt
排除站点地图规则:
// do not add sitemap rule to robots.txt
function shapeSpace_disable_sitemap_robots($wp_sitemaps) {
remove_filter('robots_txt', array($wp_sitemaps, 'add_robots'));
}
add_action('wp_sitemaps_init', 'shapeSpace_disable_sitemap_robots');
初始化Sitemaps对象时会触发wp_sitemaps_init钩子。注意:如果“发现”搜索引擎无法访问该网站,则未添加robots.txt站点地图规则(由WP常规设置“搜索引擎可见性”确定)。因此,启用该设置后,不需要上面的代码。
总结
以上就是自定义WordPress自带站点地图的所有可能的方案,希望对大家所有帮助。