public void BuildSiteMap() { SiteMapConfig siteMapConfig = new SiteMapConfig(); if (siteMapConfig.enableRefreshSiteMapOnPublish) GenerateSiteMap(); if (siteMapConfig.enableSendXMLToSearchEngines) SendSiteMapTOSearchEngines(); }
private void GenerateSiteMap() { try { SiteMapConfig siteMapConfig = new SiteMapConfig(); if (siteMapConfig.definedSites == null || !siteMapConfig.definedSites.Any()) return; if (siteMapConfig.targetDatabaseName == string.Empty) return; foreach (var site in siteMapConfig.definedSites) { if (site.Fields[SiteItemFields.SiteName] == null || string.IsNullOrEmpty(site.Fields[SiteItemFields.SiteName].Value)) continue; Sitecore.Sites.SiteContext _site = Factory.GetSite(site.Fields[SiteItemFields.SiteName].Value); if (_site == null) continue; Item _root = GetTargetDatabase().GetItem(_site.StartPath); if (_root == null) continue; string siteHostName; if (string.IsNullOrEmpty(_site.TargetHostName)) { var hostArray = _site.HostName.Split('|'); siteHostName = hostArray.FirstOrDefault(); } else { siteHostName = _site.TargetHostName; } bool useServerUrlOverride = site.Fields[SiteItemFields.ServerURL] != null && !string.IsNullOrEmpty(site.Fields[SiteItemFields.ServerURL].Value); StringBuilder sbSiteMap = new StringBuilder(); sbSiteMap.Append("<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'>"); List<Item> siteMapItems = _root.Axes.GetDescendants().Where(P => P.Fields["Show In XML SiteMap"].Value == "1").ToList(); if (siteMapItems != null && siteMapItems.Any()) { if (_root.Fields["Show In XML SiteMap"].Value == "1") siteMapItems.Add(_root); var options = global::Sitecore.Links.LinkManager.GetDefaultUrlOptions(); options.AlwaysIncludeServerUrl = true; options.LanguageEmbedding = LanguageEmbedding.Always; options.SiteResolving = true; // get langauges List<Language> _availbleLangauges = null; if (siteMapConfig.multilingualSiteMapXML) { Item _languagesRoot = GetTargetDatabase().GetItem(Guids.Items.LangaugesRootItem); _availbleLangauges = _languagesRoot.Axes.GetDescendants().Where(P => P.Fields["Iso"].Value != string.Empty).Select(P => Language.Parse(P.Fields["Iso"].Value)).ToList(); } else { _availbleLangauges = new List<Language>() { Language.Parse("en") }; } XmlDocument doc = new XmlDocument(); foreach (var langauge in _availbleLangauges) { options.Language = langauge; options.EmbedLanguage(langauge); foreach (var item in siteMapItems) { //to resolve issues with multisite link resolution here, set the rootPath="#" on the publisher site in web.config //and also add scheme="http" to the Site Definition for your site string url = LinkManager.GetItemUrl(item, options); if (useServerUrlOverride) { if (url.Contains("://" + siteHostName + "/")) { url = url.Replace(siteHostName, site.Fields[SiteItemFields.ServerURL].Value.Replace("http://", "").Replace("https://", "")); } else { url = site.Fields[SiteItemFields.ServerURL].Value + "//" + url; } } //handle where scheme="http" has not been added to Site Definitions if (url.StartsWith("://")) { url = url.Replace("://", ""); } if (!url.StartsWith("http://")) { url = "http://" + url; } string lastUpdated = DateUtil.IsoDateToDateTime(item.Fields[Sitecore.FieldIDs.Updated].Value).ToString("yyyy-MM-ddTHH:mm:sszzz"); string FrequencyChange = "yearly"; if (item.Fields[SiteMapFields.FrequencyChange] != null) { if (!string.IsNullOrEmpty(item.Fields[SiteMapFields.FrequencyChange].Value)) { Item _FrequencyChange = GetTargetDatabase().GetItem(item.Fields[SiteMapFields.FrequencyChange].Value); if (_FrequencyChange != null) FrequencyChange = _FrequencyChange.Name; } } string Priority = "0.0"; if (item.Fields[SiteMapFields.Priority] != null) { if (!string.IsNullOrEmpty(item.Fields[SiteMapFields.Priority].Value)) { Item _priority = GetTargetDatabase().GetItem(item.Fields[SiteMapFields.Priority].Value); if (_priority != null && _priority.Fields["Value"] != null && !string.IsNullOrEmpty(_priority.Fields["Value"].Value)) Priority = _priority.Fields["Value"].Value; } } sbSiteMap.Append("<url>"); sbSiteMap.Append("<loc>"); sbSiteMap.Append(url); sbSiteMap.Append("</loc>"); sbSiteMap.Append("<lastmod>"); sbSiteMap.Append(lastUpdated); sbSiteMap.Append("</lastmod>"); sbSiteMap.Append("<changefreq>"); sbSiteMap.Append(FrequencyChange); sbSiteMap.Append("</changefreq>"); sbSiteMap.Append("<priority>"); sbSiteMap.Append(Priority); sbSiteMap.Append("</priority>"); sbSiteMap.Append("</url>"); } } sbSiteMap.Append("</urlset>"); string fileName = "SiteMap.xml"; if (site.Fields[SiteItemFields.SitemMapXMLFilename] != null && !string.IsNullOrEmpty(site.Fields[SiteItemFields.SitemMapXMLFilename].Value)) fileName = site.Fields[SiteItemFields.SitemMapXMLFilename].Value; doc.LoadXml(sbSiteMap.ToString()); string xmlFilePath = MainUtil.MapPath("/" + fileName); doc.Save(xmlFilePath); if (site.Fields[SiteItemFields.AddToRobotFile] != null) { Sitecore.Data.Fields.CheckboxField _AddToRobotFile = site.Fields[SiteItemFields.AddToRobotFile]; if (_AddToRobotFile != null) { if (_AddToRobotFile.Checked) AddSitemapToRobots(fileName); } } Sitecore.Web.UI.Sheer.SheerResponse.Alert("SiteMap has been generated successfully"); } } } catch (Exception exception) { Log.Error(exception.Message, "SiteMapBuilder - GenerateSiteMap method"); } }
private void SendSiteMapTOSearchEngines() { try { SiteMapConfig siteMapConfig = new SiteMapConfig(); if (siteMapConfig.enabledSearchEngines == null) return; if (!siteMapConfig.enabledSearchEngines.Any()) return; if (siteMapConfig.definedSites == null) return; if (!siteMapConfig.definedSites.Any()) return; foreach (var engine in siteMapConfig.enabledSearchEngines) { foreach (var site in siteMapConfig.definedSites) { string SearchEngineRequstUrl = engine.Fields[SiteMapSearchEngineFields.SearchEngineRequestUrl].Value; string siteMapUrl = HttpUtility.HtmlEncode(site.Fields[SiteItemFields.ServerURL].Value + "/" + site.Fields[SiteItemFields.SitemMapXMLFilename].Value); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(SearchEngineRequstUrl + siteMapUrl); try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode != HttpStatusCode.OK) { throw new Exception("Submit SsiteMap error. Engine name is : " + engine.Name); } } catch { throw new Exception("404 error. Engine name is : " + engine.Name); } } } } catch (Exception exception) { Log.Error(exception.Message, "SiteMapBuilder - SendSiteMapTOSearchEngines"); } }
private Database GetTargetDatabase() { SiteMapConfig siteMapConfig = new SiteMapConfig(); return Factory.GetDatabase(siteMapConfig.targetDatabaseName); }