How to Generate a WordPress Sitemap Without Plugins

wordpress sitemapgenerate sitemap without pluginsitemap.xml tutorialseo optimizationsearch engine crawling
Published·Modified·

In a previous article, I discussed implementing an archive page using page templates, but that did not constitute a true sitemap. This article provides a detailed guide on using code to create a sitemap.xml that is optimized for search engine crawlers.

sitemap

1. Upload the Page Script

Save the following code as sitemap.php and upload it to your website's root directory using an FTP tool. Ensure that http://your-domain/sitemap.php is accessible.

<?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
/* Static 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 static 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>

2. Add Rewrite Rules

For Apache Servers: Modify the .htaccess file in your website's root directory and add the following rewrite rule:

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

For Nginx Servers: Locate the corresponding virtual host .conf file (for AMH hosting panels, the configuration is in /usr/local/nginx/conf/vhost/your-site.conf). Add the following rule and restart the Nginx server:

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

3. Test Access

If your WordPress blog has a caching plugin like WP-Super-Cache installed, delete the site cache first. Then, visit http://your-domain/sitemap.xml to test. For example: http://www.xiaoz.me/sitemap.xml.

You can also add the sitemap (sitemap.xml) to your website footer and submit it to major search engines to improve indexing.