Янв 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/


Свежие комментарии