Sitemap 网站地图,Google、雅虎、和微软都支持一个被称为xml网站地图(xml Sitemaps)的协议,而百度Sitemap是指百度支持的收录标准,在原有协议上做出了扩展。百度sitemap的作用是通过Sitemap告诉百度蜘蛛全面的站点链接,优化自己的网站。百度Sitemap分为三种格式:txt文本格式、xml格式、Sitemap索引格式。
简单点说这个网站地图就是为了优化网站的产物,做站都知道不管有没有用图个心理安慰。Wordpress有很多插件都可以实现,一些插件不止这一个功能还附带其他的一些功能。我就只想单纯的要一个Sitemap,网上爬了几天找到一个了PHP代码生成Sitemap。原作者是 张戈博客 我爬过来留作备用。折腾了一天发现一个问题,就是如果你VPS剩余内存小于200M可能会出现 http 500 站点错误!
本片文章只是用于我的博客,请移步查看原文:WordPress免插件生成完整站点地图(sitemap.xml)的php代码
0x01 Sitemap PHP代码
<?php require('./wp-blog-header.php'); header("Content-type: text/xml"); header('HTTP/1.1 200 OK'); $posts_to_show = 1000; echo '<?xml version="1.0" encoding="UTF-8"?>'; echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">' ?> <!-- generated-on=<?php echo get_lastpostdate('blog'); ?> Diy By 张戈博客(https://zhang.ge)--> <url> <loc><?php echo get_home_url(//res.zgboke.com/wp-content/plugins/custom-plugin/img/random/8.jpg); ?></loc> <lastmod><?php $ltime = get_lastpostmodified(GMT);$ltime = gmdate('Y-m-d\TH:i:s+00:00', strtotime($ltime)); echo $ltime; ?></lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <?php /* 文章页面 */ $myposts = get_posts( "numberposts=" . $posts_to_show ); foreach( $myposts as $post ) { ?> <url> <loc><?php the_permalink(); ?></loc> <lastmod><?php the_time('c') ?></lastmod> <changefreq>monthly</changefreq> <priority>0.6</priority> </url> <?php } /* 文章循环结束 */ ?> <?php /* 单页面 */ $mypages = get_pages(); if(count($mypages) > 0) { foreach($mypages as $page) { ?> <url> <loc><?php echo get_page_link($page->ID); ?></loc> <lastmod><?php echo str_replace(" ","T",get_page($page->ID)->post_modified); ?>+00:00</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> </url> <?php }} /* 单页面循环结束 */ ?> <?php /* 博客分类 */ $terms = get_terms('category', 'orderby=name&hide_empty=0' ); $count = count($terms); if($count > 0){ foreach ($terms as $term) { ?> <url> <loc><?php echo get_term_link($term, $term->slug); ?></loc> <changefreq>weekly</changefreq> <priority>0.8</priority> </url> <?php }} /* 分类循环结束 */?> <?php /* 标签(可选) */ $tags = get_terms("post_tag"); foreach ( $tags as $key => $tag ) { $link = get_term_link( intval($tag->term_id), "post_tag" ); if ( is_wp_error( $link ) ) return false; $tags[ $key ]->link = $link; ?> <url> <loc><?php echo $link ?></loc> <changefreq>monthly</changefreq> <priority>0.4</priority> </url> <?php } /* 标签循环结束 */ ?> </urlset>
0x02 伪静态设置
Nginx 伪静态,将一下代码插入到 WordPress 伪静态规则中。添加完后重启 Nginx 使规则生效,可以访问 https://www.xxx.com/sitemap.xml 查看是否可用。
rewrite ^/sitemap.xml$ /sitemap.php last;
0x03 生成纯静态 xml 文件
以上是伪静态的代码,也就是 sitemap.xml 会时时变化,可以通过定时任务指定时间每天生成一个 sitemap.xml 纯静态文件。PHP 代码生成 sitemap.xml 是会存在风险的,如果别人知道你网站的这个sitemap.php 文件名不停的访问,会导致服务器资源耗尽拖慢网站影响体验。避免这个问题需要将 sitemap.php 更名为一个只有自己知道的名字添加到计划任务即可。
#每天在网站根目录生成一个sitemap.xml 以下计划任务针对https网站;计划任务执行成功后可以移除伪静态设置; 0 1 * * * wget -O /home/wwwroot/opsit.cn/sitemap.xml --no-check-certificate https://www.xxrj.net/sitemap.php >/dev/null 2>&1
Ps:PHP代码可以根据需要增减内容,比如觉得标签不应该出现在sitemap里面的,可以将标签部分的php代码删除即可,但一定要注意不要误删除结尾的</urlset>标签。