Implementing Site Map (sitemap.xml) on WordPress Website without Plugins

Publish: 2015-07-28 | Modify: 2018-10-26

Previously, Xiao Z has published an article on WordPress site map without plugins. The article explains how to implement a sitemap.xml site map using code to facilitate search engine crawling.

One, Upload the Page Program

Save the following code as sitemap.php and upload it to the root directory of your website using an FTP tool. Make sure you can access it through http://yourdomain.com/sitemap.php, for example: http://www.xiaoz.me/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/">'
?>
  <url>
      <loc><?php echo get_home_url(); ?></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
/* Article pages */ 
header("Content-type: text/xml");
$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 } /* End of article loop */ ?>  
<?php
/* Single pages */ 
$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 }} /* End of single page loop */ ?> 
<?php
/* Blog categories */ 
$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 }} /* End of category loop */?> 
<?php
 /* Tags (optional) */
$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  } /* End of tag loop */ ?> 
</urlset>

Two, Add Pseudo-static Rules

If you are using an Apache server, modify the .htaccess file in the root directory of your website and add the following pseudo-static rules:

RewriteRule ^(sitemap)\.xml$ $1.php

For nginx servers, find the corresponding virtual host.conf file (the configuration file of the AMH host panel is in /usr/local/nginx/conf/vhost/yourwebsite.conf) and add the following rules, then restart the nginx server.

rewrite ^/sitemap.xml$ /sitemap.php last;

Three, Access Testing

If your WordPress blog has a caching plugin like WP-Super-Cache installed, delete the website cache first, and then access http://yourdomain.com/sitemap.xml for testing, for example: http://www.xiaoz.me/sitemap.xml. You can also add the site map (sitemap.xml) to the bottom of the website and submit it to major search engines to improve indexing.


Comments