WordPress 网站地图 Sitemap PHP 代码版

Sitemap 网站地图,Google、雅虎、和微软都支持一个被称为xml网站地图(xml Sitemaps)的协议,而百度Sitemap是指百度支持的收录标准,在原有协议上做出了扩展。百度sitemap的作用是通过Sitemap告诉百度蜘蛛全面的站点链接,优化自己的网站。百度Sitemap分为三种格式:txt文本格式、xml格式、Sitemap索引格式。

简单点说这个网站地图就是为了优化网站的产物,做站都知道不管有没有用图个心理安慰。Wordpress有很多插件都可以实现,一些插件不止这一个功能还附带其他的一些功能。我就只想单纯的要一个Sitemap,网上爬了几天找到一个了PHP代码生成Sitemap。原作者是 张戈博客 我爬过来留作备用。折腾了一天发现一个问题,就是如果你VPS剩余内存小于200M可能会出现 http 500 站点错误!
本片文章只是用于我的博客,请移步查看原文:WordPress免插件生成完整站点地图(sitemap.xml)的php代码

WordPress 网站地图 Sitemap 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.opsit.cn/sitemap.php  >/dev/null 2>&1

Ps:PHP代码可以根据需要增减内容,比如觉得标签不应该出现在sitemap里面的,可以将标签部分的php代码删除即可,但一定要注意不要误删除结尾的</urlset>标签。

人已赞赏
文章教程

LNMP1.6 Let's Encrypt SSL证书续期失败

2019-9-19 8:56:01

文章教程

Wordpress Nginx FastCGI Cache 缓存加速

2019-9-23 8:28:28

个人中心
今日签到
有新私信 私信列表
搜索