private static bool IsSitemapItem(Item item, SitemapDefinitionModel sitemapDefinition)
 {
     return(item.HasVersion() &&
            item.HasLayout() &&
            (item.IsDerived(Templates.Sitemap.Id) ||
             sitemapDefinition.IncludedTemplates.Contains(item.ID) ||
             sitemapDefinition.IncludedBaseTemplates.Any(item.IsDerived)) &&
            !sitemapDefinition.ExcludedItems.Contains(item.ID));
 }
        public IEnumerable <SitemapModel> GetSitemapItems(SitemapDefinitionModel sitemapDefinition, SiteContext siteContext)
        {
            var sitemapitems = new List <SitemapModel>();
            var urlList      = new List <string>();

            var embedLanguage = sitemapDefinition.EmbedLanguage;
            var db            = Context.Database != null ? Context.Database : Factory.GetDatabase(Sitemap.Constants.WebDatabase);

            var urlOptions = UrlOptions.DefaultOptions;

            urlOptions.AlwaysIncludeServerUrl = true;

            urlOptions.LanguageEmbedding = embedLanguage ? LanguageEmbedding.Always : LanguageEmbedding.Never;

            var items = db.SelectItems($"fast:{siteContext.StartPath}//*")
                        .Where(i => IsSitemapItem(i, sitemapDefinition))
                        .ToList();

            var dynamicItems = this.GetDynamicWildcardItems(siteContext);

            items.AddRange(dynamicItems);

            var startItem = siteContext.GetStartItem();

            if (IsSitemapItem(startItem, sitemapDefinition))
            {
                items.Insert(0, startItem);
            }
            foreach (var item in items)
            {
                var regex = new Regex(@"(\/[A-Za-z0-9]\/)");
                var url   = LinkManager.GetItemUrl(item, urlOptions);
                url = regex.Replace(url, "/").ToLowerInvariant();
                if (urlList.Contains(url))
                {
                    continue;
                }

                urlList.Add(url);
                sitemapitems.Add(new SitemapModel
                {
                    Url          = url,
                    LastModified = item.Statistics.Updated
                });
            }
            return(sitemapitems);
        }
        public Dictionary <string, SitemapDefinitionModel> GetSitemapDefinitions()
        {
            var result = new Dictionary <string, SitemapDefinitionModel>();

            foreach (XmlNode node in Sitecore.Configuration.Factory.GetConfigNodes(Constants.SitemapNode))
            {
                var definition = new SitemapDefinitionModel()
                {
                    SiteName      = XmlUtil.GetAttribute(Constants.SiteName, node),
                    EmbedLanguage = MainUtil.GetBool(XmlUtil.GetAttribute(Constants.EmbedLanguage, node), true)
                };

                definition.IncludedBaseTemplates = ParseXml2List(Constants.IncludeBaseTemplates, node);
                definition.IncludedTemplates     = ParseXml2List(Constants.IncludeTemplates, node);
                definition.ExcludedItems         = ParseXml2List(Constants.ExcludeItems, node);

                result.Add(definition.SiteName, definition);
            }

            return(result);
        }