public override void Process(CreateSitemapXmlArgs args)
        {
            var langs    = LanguageManager.GetLanguages(Context.Database);
            var homeItem = Context.Database.GetItem(args.Site.RootPath + args.Site.StartItem);
            var def      = Configuration[args.Site.Name];

            if (def.EmbedLanguage)
            {
                foreach (var lang in langs)
                {
                    args.Nodes.AddRange(ProcessSite(homeItem, def, lang));
                }
            }
            else
            {
                args.Nodes.AddRange(ProcessSite(homeItem, def, Context.Language));
            }
        }
Exemple #2
0
        public void ProcessRequest(HttpContext context)
        {
            var configuredSites = Sitecore.Configuration.Factory.GetConfigNodes("sitemap/site")
                                  .Cast <XmlNode>()
                                  .Select(node => XmlUtil.GetAttribute("name", node));

            var website = Sitecore.Configuration.Factory.GetSiteInfoList()
                          .FirstOrDefault(i => i.HostName.ToLower().Split('|').Contains(context.Request.Url.Host.ToLower()));

            if (website == null || (website.Port > 0 && website.Port != context.Request.Url.Port))
            {
                context.Response.StatusCode = 404;
                return;
            }

            if (!configuredSites.Contains(website.Name))
            {
                context.Response.StatusCode = 404;
                return;
            }

            Sitecore.Context.SetActiveSite(website.Name);

            context.Response.ContentType = "text/xml";
            context.Response.Write("<?xml version=\"1.0\" encoding=\"utf-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
            var args = new CreateSitemapXmlArgs(website);

            CorePipeline.Run("createSitemapXml", args);
            var sb = new StringBuilder();

            foreach (var node in args.Nodes)
            {
                sb.Append("<url>")
                .AppendFormat("<loc>{0}</loc>", node.Location)
                .AppendFormat("<lastmod>{0}</lastmod>", node.LastModified.ToString("yyyy-MM-ddThh:mm:sszzz"))
                .Append("</url>");
                context.Response.Write(sb.ToString());
                sb.Clear();
            }
            context.Response.Write("</urlset>");
        }
 public abstract void Process(CreateSitemapXmlArgs args);
Exemple #4
0
        public void OnRebuild(object sender, EventArgs ea)
        {
            var configuredSites = Sitecore.Configuration.Factory.GetConfigNodes("sitemap/site")
                                  .Cast <XmlNode>()
                                  .Select(node => XmlUtil.GetAttribute("name", node));
            var availableSites = Sitecore.Configuration.Factory.GetSiteInfoList().Where(s => configuredSites.Contains(s.Name));

            foreach (var website in availableSites)
            {
                using (new SiteContextSwitcher(new SiteContext(website)))
                {
                    var folder = Sitecore.IO.FileUtil.MapPath($"{Sitecore.Configuration.Settings.GetSetting("Sitemap.Xml.TempDirectory").TrimEnd('/')}/{website.Name}");
                    var di     = Directory.CreateDirectory(folder);

                    foreach (var file in di.EnumerateFiles("*.tmp"))
                    {
                        file.Delete();
                    }

                    var segments = new List <string>(); // to hold each sitemap segment filename
                    var args     = new CreateSitemapXmlArgs(website);
                    CorePipeline.Run("createSitemapXml", args);

                    int count = 0, suffix = 0;
                    var sb = new StringBuilder();
                    foreach (var node in args.Nodes)
                    {
                        sb.Append("<url>")
                        .AppendFormat("<loc>{0}</loc>", node.Location)
                        .AppendFormat("<lastmod>{0}</lastmod>", node.LastModified.ToString("yyyy-MM-dd"))
                        .Append("</url>");
                        count++;

                        if (count >= NodeLimit || sb.Length >= SizeLimit)
                        {
                            var fileName = $"sitemap_segment_{++suffix}.tmp";
                            File.WriteAllText(folder + "\\" + fileName, "<?xml version=\"1.0\" encoding=\"utf-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">" + sb.ToString() + "</urlset>");
                            segments.Add(fileName);
                            sb.Clear();
                            count = 0;
                        }
                    }

                    if (segments.Any())
                    {
                        // Prepare sitemap index
                        var sbIndex = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
                                      .Append("<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
                        // The following kludge uses the first sitemap node to generate the sitemmap segment prefix
                        Uri firstLoc = new Uri(args.Nodes.First().Location);
                        var prefix   = $"{firstLoc.Scheme}://{firstLoc.Host}/";
                        foreach (var segment in segments)
                        {
                            sbIndex.Append("<sitemap>")
                            .AppendFormat("<loc>{0}</loc>", prefix + segment.Replace(".tmp", ".xml"))
                            .AppendFormat("<lastmod>{0}</lastmod>", DateTime.Now.ToString("yyyy-MM-dd"))
                            .Append("</sitemap>");
                        }
                        sbIndex.Append("</sitemapindex>");
                        File.WriteAllText($"{folder}\\sitemap_index.tmp", sbIndex.ToString());
                    }
                    else
                    {
                        // Dump whole sitemap
                        File.WriteAllText($"{folder}\\sitemap.tmp", "<?xml version=\"1.0\" encoding=\"utf-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">" + sb.ToString() + "</urlset>");
                    }

                    foreach (var file in di.EnumerateFiles("*.xml"))
                    {
                        file.Delete();
                    }

                    foreach (var file in di.EnumerateFiles("*.tmp"))
                    {
                        file.MoveTo(Path.ChangeExtension(file.FullName, ".xml"));
                    }
                }
            }
        }