WordPress 原生XML站点地图功能

知更鸟
知更鸟
站长
2334
文章
0
粉丝
WordPress131,818阅读模式

WordPress 在 5.5 版中引入了 XML 站点地图功能,将自动为您的站点生成 XML 站点地图。WordPress 生成的站点地图索引文件,最多可包含 50,000 个单独的站点地图。每个单独的站点地图最多可以包含 2,000 个 URL。

WordPress 原生XML站点地图功能-图片1

WordPress XML站点地图功能

查看WordPress自动生成的XML站点地图方法:你的域名/wp-sitemap.xml

对于这个WordPress原生的XML站点地图功能,众说纷纭,概括一下,肯定没有专业的SEO插件方便好用。经测试,百度目前支持WordPress原生的XML站点地图,就是感觉没有我主题自带的按百度要求格式生成的站点地图索引快,主题生成的站点地图隔天就索引了,但WordPress原生的XML站点地图链接提交几天后才索引,之所以索引慢,感觉是WP动态生成的站点地图速度慢。

下面是我自己博客的索引截图:

WordPress 原生XML站点地图功能-图片2

WordPress原生的XML站点地图首页是文章、分类、标签、自定义分类法目录索引链接。

如果提交给搜索引擎如百度,需要分别提交链接:

比如文章:https://xxxxx/wp-sitemap-posts-post-1.xml

不能提交首页:https://xxxxx/wp-sitemap.xml

鉴于索引有些慢,更适合更新不是很频繁的站点,如果嫌索引慢而不想使用这个功能,或者还是想用第三方插件功能生成站点地图,可以用下面的代码禁用WordPress自带的XML站点地图功能:

add_filter( 'wp_sitemaps_enabled', '__return_false' );

程序文件位置:wp-includes\sitemaps\class-wp-sitemaps.php

另外,WordPress 也提供了过滤器,可以在站点地图中排除部分内容,比如从站点地图中删除页面、标签等。

站点地图排除页面

add_filter(
	'wp_sitemaps_post_types',
	function( $post_types ) {
	unset( $post_types['page'] );
	return $post_types;
	}
);

站点地图排除标签

add_filter(
	'wp_sitemaps_taxonomies',
	function( $taxonomies ) {
		unset( $taxonomies['post_tag'] );
		return $taxonomies;
	}
);

站点地图排除分类

add_filter(
	'wp_sitemaps_taxonomies',
	function( $taxonomies ) {
		unset( $taxonomies['category'] );
		return $taxonomies;
	}
);

站点地图排除部分文章

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; // 排除的文章ID.
		return $args;
	}, 10, 2 
);

站点地图排除某个分类的文章

add_filter(
	'wp_sitemaps_taxonomies_query_args',
	function( $args ) {
		$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : array();
		$args['exclude'][] = 7;// 分类ID
		return $args;
	}
);

站点地图排除某个用户链接

add_filter(
	'wp_sitemaps_users_query_args',
	function( $args ) {
		$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : array();
		$args['exclude'][] = 1;// 用户ID
		return $args;
	}
);

根据自定义栏目排除文章

// 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);

站点地图显示文章最后更新日期

add_filter(
	'wp_sitemaps_posts_entry',
	function( $entry, $post ) {
		$entry['lastmod'] = $post->post_modified_gmt;
		return $entry;
	},
	10,
	2
);

 修改 WordPress 原生站点地图名称

add_action( 'init', 'add_new_url_main_sitemap' );
add_filter( 'home_url', 'fix_wp_sitemap_url', 11, 2 );
// 修改新站点地图链接规则
function add_new_url_main_sitemap() {
	add_rewrite_rule( '^zm-sitemap\.xml$', 'index.php?sitemap=index', 'top' );
}

// 将默认的wp-sitemap.xml改为zm-sitemap
function fix_wp_sitemap_url( $url, $path ) {
	if ( '/wp-sitemap.xml' === $path ) {
		return str_replace( '/wp-sitemap.xml', '/zm-sitemap.xml', $url );
	}
	return $url;
}

上面的例子是将默认的wp-sitemap.xml改为zm-sitemap.xml,修改其中的zm-sitemap,让别人不知道你的站点地图链接是什么。

更改后需要到WP后台→固定链接,保存一下固定链接设置,否则不会生效。

不过总的索引目录名称改了,但子项的文章列表链接还是默认的,完全修改方法还在研究,初步思路:

展开收缩

例如,修改文章索引链接/wp-sitemap-posts-post-1.xml为my-sitemap-posts-1.xml

// 重写链接规则,文件位于wp-includes\sitemaps目录class-wp-sitemaps.php
add_action( 'init', 'zm_add_new_sitemap_posts_url' );
function zm_add_new_sitemap_posts_url() {
	add_rewrite_rule(
		'^my-sitemap-posts-([a-z]+?)-(\d+?)\.xml$',
		'index.php?sitemap=$matches[1]&paged=$matches[2]',
		'top'
	);
}
// 修改文章索引链接
add_filter( 'home_url', 'zm_sitemap_posts', 11, 2 );
function zm_sitemap_posts( $url, $path ) {
	if ( '/wp-sitemap-posts-post-1.xml' === $path ) {
		return str_replace( '/wp-sitemap-posts-post-1.xml', '/my-sitemap-posts-1.xml', $url );
	}
	return $url;
}

添加代码后,链接确实是变了,但打开直接404了,大概原因第一段的链接替换规则不对,有点高难,哪位高手帮改一下吧。

修改默认链接名称,个人认为很有必要,不然这个带链接的文章列表,可能会被恶意采集者利用上。因暂时无法更改默认的子项链接,另外,原生站点地图是动态生成,如果文章很多可能生成速度比较慢,造成搜索引擎无法索引,所以还是考虑禁用吧。

修改每页显示数量:

通过wp_sitemaps_max_urls 可以修改站点地图中包含的最大 URL 数, 默认值为 2000 个 URL。

将下面代码加到主题函数模板functions.php中:

add_filter( 'wp_sitemaps_max_urls', 'theme_wp_sitemaps_max_urls' );
function theme_wp_sitemaps_max_urls(){
    return 5000;
}

判断地图功能是否开启

if ( wp_sitemaps_get_server()->sitemaps_enabled() ) {
	echo '地图已开启';
} else {
	echo '地图已禁用';
};

 

更改 XML 站点地图的外观

  • wp_sitemaps_stylesheet_url- 站点地图样式表的 URL。
  • wp_sitemaps_stylesheet_index_url- 站点地图索引样式表的 URL。
  • wp_sitemaps_stylesheet_content- 站点地图样式表的内容。
  • wp_sitemaps_index_stylesheet_content- 站点地图索引样式表的内容。
  • wp_sitemaps_stylesheet_css- 滤站点地图样式表的 CSS。

 

更多

之前,WordPress 不提供任何 SEO 功能,只能靠第三方插件或者高级主题自带的SEO功能,这次将站点地图集成到核心程序中,是一个良好的开端。

 

本站文章大部分为原创,用于个人学习记录,可能对您有所帮助,仅供参考!

weinxin
我的微信
微信号已复制
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
 
知更鸟
评论  13  访客  11  作者  2
    • 芊芊精典
      芊芊精典 2

      不错,感谢鸟哥分享,学习了。

      • maqingxi
        maqingxi 5

        百度修改了站点地图的提交方式,不再支持索引型站点地图文件了。

          • 知更鸟
            知更鸟

            @ maqingxi 我已测试成功,百度支持WP原生站点地图XML,截图已加文章中

          • 蓝莲花
            蓝莲花 3

            啥时候建个群呀

            • 禹步网
              禹步网 2

              很实用的功能

              • 代码骑士
                代码骑士 0

                这么多年了,知更鸟还在坚持下去,实在不简单啊。

                • 久伴
                  久伴 2

                  不错感谢分享:wink:

                  • xinbc.com
                    xinbc.com 0

                    yoast-sitemap的比原生的好用

                    • 网络民工
                      网络民工 0

                      请问/wp-sitemap-taxonomies-category-1.xml类似这个,百度抓取一直报404,但这个页面源站是可以访问的,F12看了下,源站和CDN也报404,需要如何判断问题出在那了呢?

                      • 小河
                        小河 1

                        测试成功 谢谢

                      匿名

                      发表评论

                      匿名网友
                      :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

                      拖动滑块以完成验证