WordPress教程

WordPress 详解原生XML站点地图功能

阿里云

WordPress 在 5.5 版中引入了 XML 站点地图功能,将自动为您的站点生成 XML 站点地图。WordPress 生成的站点地图索引文件,最多可包含 50,000 个单独的站点地图。每个单独的站点地图最多可以包含 2,000 个 URL。查看 WordPress 自动生成的 XML 站点地图方法:你的域名/wp-sitemap.xml,对于这个 WordPress 原生的 XML 站点地图功能,众说纷纭,概括一下,肯定没有专业的 SEO 插件方便好用。

经测试,百度目前支持 WordPress 原生的 XML 站点地图,就是感觉没有我主题自带的按百度要求格式生成的站点地图索引快,主题的隔天就索引了,但 WordPress 原生的 XML 站点地图链接提交几天后才索引。
WordPress 原生的 XML 站点地图首页是文章、分类、标签、自定义分类法目录索引链接。

也想出现在这里?联系我们
创客主机

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

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

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

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

  1.     add_filter( 'wp_sitemaps_enabled', '__return_false' );

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

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

站点地图排除页面

  1.     add_filter(
  2.     	'wp_sitemaps_post_types',
  3.     	function( $post_types ) {
  4.     	unset( $post_types['page'] );
  5.     	return $post_types;
  6.     	}
  7.     );

站点地图排除标签

  1.     add_filter(
  2.     	'wp_sitemaps_taxonomies',
  3.     	function( $taxonomies ) {
  4.     		unset( $taxonomies['post_tag'] );
  5.     		return $taxonomies;
  6.     	}
  7.     );

站点地图排除分类

  1.     add_filter(
  2.     	'wp_sitemaps_taxonomies',
  3.     	function( $taxonomies ) {
  4.     		unset( $taxonomies['category'] );
  5.     		return $taxonomies;
  6.     	}
  7.     );

站点地图排除部分文章

  1.     add_filter(
  2.     	'wp_sitemaps_posts_query_args',
  3.     	function( $args, $post_type ) {
  4.     		if ( 'post' !== $post_type ) {
  5.     			return $args;
  6.     		}
  7.  
  8.     	$args['post__not_in'] = isset( $args['post__not_in'] ) ? $args['post__not_in'] : array();
  9.     		$args['post__not_in'][] = 123; // 排除的文章ID.
  10.     		return $args;
  11.     	}, 10, 2 
  12.     );

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

  1.     add_filter(
  2.     	'wp_sitemaps_taxonomies_query_args',
  3.     	function( $args ) {
  4.     		$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : array();
  5.     		$args['exclude'][] = 7;// 分类ID
  6.     		return $args;
  7.     	}
  8.     );

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

  1.     add_filter(
  2.     	'wp_sitemaps_users_query_args',
  3.     	function( $args ) {
  4.     		$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : array();
  5.     		$args['exclude'][] = 1;// 用户ID
  6.     		return $args;
  7.     	}
  8.     );

根据自定义栏目排除文章

  1.     // disable post based on meta field
  2.     function shapeSpace_disable_sitemap_post_meta($args, $post_type) {
  3.  
  4.     	if ('post' !== $post_type) return $args; // can be any post type
  5.  
  6.     	$args['meta_query'] = isset($args['meta_query']) ? $args['meta_query'] : array();  
  7.  
  8.     	$args['meta_query'][] = array(
  9.  
  10.     		'key'     => 'sitemap', // can be any meta key
  11.     		'value'   => '1',       // can be any meta value
  12.     		'compare' => '=',       // can use any comparison
  13.     	);
  14.  
  15.     	return $args;
  16.  
  17.     }
  18.     add_filter('wp_sitemaps_posts_query_args', 'shapeSpace_disable_sitemap_post_meta', 10, 2);

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

  1.     add_filter(
  2.     	'wp_sitemaps_posts_entry',
  3.     	function( $entry, $post ) {
  4.     		$entry['lastmod'] = $post->post_modified_gmt;
  5.     		return $entry;
  6.     	},
  7.     	10,
  8.     	2
  9.     );

修改 WordPress 原生站点地图名称

  1.     add_action( 'init', 'add_new_url_main_sitemap' );
  2.     add_filter( 'home_url', 'fix_wp_sitemap_url', 11, 2 );
  3.     // 修改新站点地图链接规则
  4.     function add_new_url_main_sitemap() {
  5.     	add_rewrite_rule( '^zm-sitemap\.xml$', 'index.php?sitemap=index', 'top' );
  6.     }
  7.  
  8.     // 将默认的wp-sitemap.xml改为zm-sitemap
  9.     function fix_wp_sitemap_url( $url, $path ) {
  10.     	if ( '/wp-sitemap.xml' === $path ) {
  11.     		return str_replace( '/wp-sitemap.xml', '/zm-sitemap.xml', $url );
  12.     	}
  13.     	return $url;
  14.     }

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

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

不过总的索引目录名称改了,但子项的文章列表链接还是默认的,完全修改方法还在研究,初步思路(例如,修改文章索引链接/wp-sitemap-posts-post-1.xml 为 my-sitemap-posts-1.xml):

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

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

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

判断地图功能是否开启

  1.     if ( wp_sitemaps_get_server()->sitemaps_enabled() ) {
  2.     	echo '地图已开启';
  3.     } else {
  4.     	echo '地图已禁用';
  5.     };

WordPress 详解原生 XML 站点地图功能

已有 178 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!