Skip to content

Instantly share code, notes, and snippets.

@tommysundstrom
Last active January 1, 2022 23:21

Revisions

  1. tommysundstrom revised this gist Jun 11, 2013. 1 changed file with 4 additions and 2 deletions.
    6 changes: 4 additions & 2 deletions sitemap.xml.builder
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,8 @@
    # encoding: utf-8
    xml.instruct!

    # Drop this file in your source directory
    #
    # Uses the builder gem.
    # Add
    # gem 'builder', '~> 2.0'
    @@ -18,8 +20,8 @@ xml.instruct!
    # http://www.sitemaps.org/protocol.html
    # http://support.google.com/webmasters/bin/answer.py?hl=en&answer=156184&topic=8476&ctx=topic
    #
    # Remember to exchange www.your-domain.com for your domain (line 62)
    # and to set an apropriate update frequency for your site (line 82)
    # Remember to exchange www.your-domain.com for your domain (line 64)
    # and to set an apropriate update frequency for your site (line 84)

    xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do
    page_count = 0
  2. tommysundstrom revised this gist Jun 11, 2013. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions sitemap.xml.builder
    Original file line number Diff line number Diff line change
    @@ -17,6 +17,9 @@ xml.instruct!
    # For details on how to construct a site map, see
    # http://www.sitemaps.org/protocol.html
    # http://support.google.com/webmasters/bin/answer.py?hl=en&answer=156184&topic=8476&ctx=topic
    #
    # Remember to exchange www.your-domain.com for your domain (line 62)
    # and to set an apropriate update frequency for your site (line 82)

    xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do
    page_count = 0
  3. tommysundstrom created this gist Jun 11, 2013.
    110 changes: 110 additions & 0 deletions sitemap.xml.builder
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,110 @@
    # encoding: utf-8
    xml.instruct!

    # Uses the builder gem.
    # Add
    # gem 'builder', '~> 2.0'
    # to the Gemfile, and run builder install
    #
    # Add this line to config.rb:
    # page "/sitemap.xml", :layout => false
    #
    # To tell Google and other search services about the sitemap, add
    # Sitemap: http://www.your-domain.com/sitemap.xml
    # to the robots.txt file. Or see
    # http://support.google.com/webmasters/bin/answer.py?hl=en&answer=183669&topic=8476&ctx=topic for other options.
    #
    # For details on how to construct a site map, see
    # http://www.sitemaps.org/protocol.html
    # http://support.google.com/webmasters/bin/answer.py?hl=en&answer=156184&topic=8476&ctx=topic

    xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do
    page_count = 0
    sitemap.resources.each do |page|
    catch :next_page do

    # If all you want the sitemap to cover is normal html pages, use this:
    # throw :next_page unless page.url.end_with?('.html')
    #
    # If you need more detailed control, this is a starting point:
    throw :next_page if page.url.start_with?('/images/')
    throw :next_page if page.url.start_with?('/javascripts/')
    throw :next_page if page.url.start_with?('/stylesheets/')
    throw :next_page if page.url.start_with?('/layouts/')
    throw :next_page if page.url.start_with?('/apple-touch-icon')
    throw :next_page if page.url.end_with?('.xml')
    throw :next_page if page.url.start_with?('/.') # .htaccess, .DS_Store, .git etc.
    throw :next_page if page.url == '/robots.txt'
    throw :next_page if page.url == '/favicon.ico'
    throw :next_page if page.url == '/humans.txt'

    # Exclude drafts
    throw :next_page if defined?(page.data) && page.data['published'] == false
    throw :next_page if defined?(page.data) && page.data['date'] && page.data['date'].to_time > Time.now

    # Exclude archive indexes
    # I prefer not to have the calendar archive index pages in the sitemap.
    # Remove this if you want them.
    (2000..2030).each do |year|
    # Exclude year index, directories and subdirectories
    throw :next_page if page.url == "/#{year}.html" || page.url == "/#{year}" || page.url.start_with?("/#{year}/")
    end

    # Count pages
    page_count += 1
    raise "Over 50 000 pages, to much for a single sitemap" if page_count > 50000

    # Build xml of sitemap
    xml.url do
    xml.loc 'http://www.your-domain.com' + page.url # TODO: possibly remove .html

    # As usual, it's hard to get any solid information on how the search engines are
    # using the information in the site map. lastmod (last modified) and changefreq
    # (change frequency) seams to overlap each other. My guess is that it's best to
    # use lastmod for pages where you know when the file changed, and changefreq for
    # dynamic pages, like the first page of a blog and archive pages, where it's
    # hard to know when the dynamic information was changed.
    #
    # Possible values for changefreq
    # always
    # hourly
    # daily
    # weekly
    # monthly
    # yearly
    # never

    case page.url
    when '/index.html'
    xml.changefreq 'daily' # Set this to a suitable value for your site
    else
    # Setting last modified (lastmod)
    #
    # Checks date in frontmatter and modification date of file, and uses the most recent.
    # (Note: Will not be able to get the correct date for pages with dynamic content)
    frontmatter_date = nil
    frontmatter_date = page.data['date'].to_time.getlocal if defined?(page.data) && page.data['date']
    file_mtime = nil
    file_mtime = File.mtime(page.source_file).to_time.getlocal if defined?(page.source_file)
    most_recent = [frontmatter_date, file_mtime].compact.max if frontmatter_date || file_mtime

    xml.lastmod most_recent.strftime("%Y-%m-%d") # Using the more recent of the two dates.
    # Using only date, stripping clock
    end

    # Priority (priority)
    #
    # To adjust the priority of a page, set sitemap_priority: in the frontmatter.
    frontmatter_sitemap_priority = page.data['sitemap_priority'].to_f if (defined?(page.data) && page.data['sitemap_priority'])
    if frontmatter_sitemap_priority && frontmatter_sitemap_priority < 0 && frontmatter_sitemap_priority > 1
    raise "Incorrect sitemap_priority #{sitemap_priority} for #{page.destination_path}"
    end
    if frontmatter_sitemap_priority && frontmatter_sitemap_priority >= 0 && frontmatter_sitemap_priority <= 1
    xml.priority frontmatter_sitemap_priority unless frontmatter_sitemap_priority == 0.5 # (No use setting the default priority)
    end

    end
    end
    end
    end