到目前为止,大多数人都听说过WordPress 5.5 版中引入的WP 站点地图功能。从我读到的大多数需要站点地图的现有站点中,已经通过许多免费站点地图插件之一拥有一个。但是对于未来的新WordPress 站点,在 WordPress 核心中拥有所有站点地图代码现在意味着新站点可以选择使用默认的 WordPress 站点地图,或者使用专用插件来完成这项工作。这篇文章针对的是使用 WordPress 站点地图的人,并展示了如何自定义输出,但是这是必需的。
内容
- 为什么要自定义站点地图?
- 加强安全
- 改善搜索引擎优化
- 保持站点地图的重点
- 底线
- 潜入之前..
- 默认站点地图功能
- 自定义站点地图的代码片段
- 完全禁用所有 WP 站点地图
- 禁用用户站点地图
- 禁用帖子类型的站点地图
- 禁用分类站点地图
- 从站点地图中排除特定页面
- 从站点地图中排除特定帖子
- 基于元字段排除帖子
- 奖励:检查是否启用了 WP 站点地图
- 奖励:从 robots.txt 中排除站点地图规则
- 最后的东西
为什么要自定义站点地图?
对于那些使用 WordPress 提供的站点地图的人,您可能会发现需要进行一些自定义来满足您站点的特定需求。您可能想要自定义默认的、万能的 WP 站点地图的一些原因:
加强安全
默认情况下,WordPress 站点地图会显示作为任何帖子、页面或自定义帖子类型作者的每个用户的用户名。对真的。这是因为 WordPress 在作者存档URL中包含用户名的方式。例如,这是我自己在 Perishable Press 上的作者存档链接:
https://perishablepress.com/author/perish/
其中“perish”是最初为我的WP个人资料注册的用户名。所以现在从 WP 5.5 开始,该URL(和用户名)默认包含在站点地图中。这适用于所有运行 5.5 及更高版本的 WordPress 网站。所有帖子作者的用户名都包含在内,并可通过 WP Sitemaps公开获得。
// 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..
对于某些网站来说,这没什么大不了的。但是对于许多其他站点,用户名站点地图可能会被认为存在一些安全风险。为什么?因为它们使不良行为者能够获得所有这些多汁的用户名信息,然后可用于形成各种恶意攻击(例如,网络钓鱼、暴力登录尝试等)。正如我在保护 WordPress的视频课程中所解释的那样,限制敏感信息(如用户名)的暴露极大地提高了网站的安全性。
改善搜索引擎优化
改进SEO是自定义站点地图的另一个好理由。例如,许多电子商务网站使用各种特定于操作的页面。像结帐页面、支付成功页面、支付失败页面、会员页面、错误页面和其他动态页面,除非用户正在执行一些特定于上下文的操作(例如购买)。
这是来自我的专业插件网站 Plugin Planet 的付款成功页面示例,除非您正在购买,否则基本上是一个空白页面。您不想在站点地图中包含这些类型的页面,因为它们对典型的站点访问者、机器人等毫无用处且毫无意义。通过从站点地图中排除此类页面,您可以帮助避免搜索引擎遇到的“精简”内容和“软 404”错误。
保持站点地图的重点
自定义站点地图的另一个原因是尽量减少冗余并尽可能集中注意力。在各个方面发出清晰、强烈的信号。甚至是站点地图。
例如,在我的found-images 站点中,我从站点地图中排除了类别存档链接。在那个站点,所有帖子都被归类为“未分类”,因为我只使用标签来组织内容。因此,站点地图包含指向类别档案的链接是没有意义的,因为它包含通过“帖子”站点地图和集体“标签”站点地图包含的所有相同帖子。
因此,对于该站点,排除类别站点地图有助于最大程度地减少冗余并尽可能集中注意力。
底线
您可能想要自定义 WordPress 生成的站点地图的输出的原因有很多。一般来说,由 WordPress 生成的千篇一律的站点地图可能不适合您网站的安全性和SEO目标。通过一些定制,您可以加强安全性、关注链接公平性并保持优化。这篇文章向您展示了如何使用一些选择代码片段来做到这一点。所有这些都非常容易实现,几乎不需要编辑。
潜入之前..
这篇文章是关于自定义WordPress 5.5中引入的自动站点地图功能。大多数人可能会为此使用插件,许多 SEO 插件现在可以很好地与 WordPress 站点地图集成,并提供自定义选项等。如果不是这样,有人让我知道,我会构建一个可以做到这一点的插件,或者可能将一些选项集成到我的免费插件Disable WP Sitemaps中。
这就是我们在这里的原因:使用一些简单的代码片段来自定义 WordPress 站点地图的输出。如果您不熟悉站点地图功能,请查看本文以了解更多信息。
默认站点地图功能
目前,默认情况下,WP Sitemap 为以下任何/所有项目(如果存在)生成站点地图:
- 用户(包括所有帖子作者的作者档案视图的链接)
- 帖子类型(包括帖子、页面和任何其他公共自定义帖子类型)
- 分类法(包括类别、标签和任何自定义分类法)
这篇文章解释了如何根据需要排除每个站点地图。它还向您展示了如何排除特定用户、帖子类型和分类法。所以基本上你可以使用一些简单的复制/粘贴代码片段来定制任何东西。
自定义站点地图的代码片段
现在让我们进入一些代码。您将在下面找到复制/粘贴代码示例,这些示例可用于自定义 WordPress 站点地图(在 WP 版本 5.5 及更高版本中可用)。为方便起见,这里有一个快速跳转菜单:
- 完全禁用所有 WP 站点地图
- 禁用用户站点地图
- 禁用帖子类型的站点地图
- 禁用分类站点地图
- 从站点地图中排除特定页面
- 从站点地图中排除特定帖子
- 基于元字段排除帖子
- 奖励:检查是否启用了 WP 站点地图
- 奖励:从 robots.txt 中排除站点地图规则
返回主菜单↑
完全禁用所有 WP 站点地图
我写了一个插件来完全禁用 WP Sitemaps。您可以在 WP Plugin Directory了解更多信息并下载。该插件非常简单,仅包含一行代码。
因此,您可以使用该插件禁用所有站点地图,或者您可以通过文件将相同的代码行添加到您的主题模板,甚至更好的子主题中functions.php
。这是魔术片段:
add_filter('wp_sitemaps_enabled', '__return_false');
我们在这里所做的只是将 的值返回false
给过滤器挂钩,wp_sitemaps_enabled
. 它的设计很简单,这是让 WP 如此易于定制和制作自己的东西之一。
旧版本的代码
如果您在某处的教程中看到此代码,它可能会起作用,但据我所知,它来自旧版本。
remove_action('init', 'wp_sitemaps_get_server');
不要使用该代码,而是使用上述最新推荐的技术。仅出于完整性考虑将其包含在此处。
禁用用户站点地图
正如漫无边际的为什么要定制?上面部分,对于大多数站点,排除/禁用整个用户站点地图以帮助提高安全性可能是个好主意。这是实现它的即插即用代码:
// 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']); // can be post, page, or any post type
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);
和以前一样的交易。仅在此处注意函数中的第一行,我们正在检查 是否$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', 10, 2);
对于这种技术,我们再次使用wp_sitemaps_posts_query_args
过滤器钩子。可以修改该技术以匹配几乎任何一组帖子。查看Meta API以更好地了解可能的情况。强大的东西。
奖励:检查是否启用了 WP 站点地图
如前所述, WordPress 可以轻松禁用/启用其站点地图功能。因此,如果您正在自定义内容,了解网站上是否启用了 WP 站点地图可能会很有用。这是执行此操作的代码:
if (wp_sitemaps_get_server()->sitemaps_enabled()) {
// sitemaps enabled
} else {
// sitemaps not enabled
}
此代码使用wp_sitemaps_get_server()调用该sitemaps_enabled
方法,该方法返回一个值true
是否启用站点地图,或者false
是否启用。在 WordPress.org了解更多关于WP_Sitemaps 的信息。
奖励:从 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');
无需进行任何更改,只需抓取、吞咽并继续。正如所料,wp_sitemaps_init钩子在 Sitemaps 对象初始化时触发。美好的时光。