preload
Янв 15

Карты сайта Google очень хороши, чтобы указать гуглу, где что находится. Частенько этого хотят сеошники, или вы очень часто обновляете контент и хотите, чтобы гугл индексировал вас чаще.
Независимо от того, зачем вам нужны эти файлы, следующий код позволяет вам генерировать карты сайта для динамического сайта на Ruby.

Непосредственно класс:


  require 'net/http'
  require 'uri'

  # Класс для генерации карты сайта из базы данных
  # Автор: Alastair Brunton
  class GoogleSitemapGenerator

    def initialize(base_url, sources)
      @base_url = base_url
      @sources = sources
    end

    # Основной метод генератора, добавляющий данные в path_array
    # из других источников
    # Источники: страницы(pages), события(events), свойства(properties)
    def generate
      path_ar = Array.new
      @sources.each do |source|

        # инициализация класса и вызов метода get_paths для него
        path_ar = path_ar + eval("#{source}.get_paths")
      end
      xml = generate_xml(path_ar)
      save_file(xml)
      update_google
    end

    # Метод для создания xml-документа
  	def generate_xml(path_ar)
  		xml_str = ""
  		xml = Builder::XmlMarkup.new(:target => xml_str)

  		xml.instruct!
  			xml.urlset(:xmlns=>'http://www.google.com/schemas/sitemap/0.84') {
    			path_ar.each do |path|
      	    xml.url {
        	    	xml.loc(@base_url + path[:url])
        			xml.lastmod(path[:last_mod])
        			xml.changefreq('weekly')
     			 }
    			end
  			}
  		xml_str
  	end

        # Сохраняем xml-файл на диск
  	def save_file(xml)
  		File.open(RAILS_ROOT + '/public/sitemap.xml', "w+") do |f|
  			f.write(xml)
  		end
  	end

  	# Оповещаем гугл
  	def update_google
  	    sitemap_uri = @base_url + '/sitemap.xml'
  	    escaped_sitemap_uri = URI.escape(sitemap_uri)
  	    Net::HTTP.get('www.google.com',
  	                  '/webmasters/sitemaps/ping?sitemap=' +
  	                  escaped_sitemap_uri)
  	end

  end

Вы, наверное, заметили массив строк, передаваемых генератору. Это имена объектов, реализующих метод get_paths. Вот образец:

   def self.get_paths
     path_ar = Array.new
     Property.live_properties.each do |property|
       path_ar < < {:url => "/property/#{property.to_param}", :last_mod => property.updated_at.strftime('%Y-%m-%d')}
     end
     path_ar
   end

Лучшим решением для запуска этого зверя на production-сервере будет cron. Вот пример задания rake для этого:

  namespace :google_sitemap do
    desc "Generate a google sitemap from the site."
    task(:generate => :environment) do
      sources = ['Page', 'Event', 'Property']
      sitemap = GoogleSitemapGenerator.new('http://www.your_url.com', sources)
      sitemap.generate
    end
  end

Запомните, что когда вы вызываете генератор из cron, нужно указать RAILS_ENV.

 cd /var/www/apps/site/current /usr/bin/rake RAILS_ENV=production google_sitemap:generate

Подглядел на http://scoop.cheerfactory.co.uk/

Связанные записи

Ваш отзыв