Last active
May 15, 2020 17:42
-
-
Save alindgren/1439022194a472d83ddf to your computer and use it in GitHub Desktop.
XML sitemap for Umbraco 7 (based on Cultiv Search Engine Sitemap package). See http://www.alexlindgren.com/archive/dynamically-generated-xml-sitemaps-with-umbraco-7/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage | |
@using System.Linq; | |
@{ | |
Layout = null; | |
Response.ContentType = "text/xml"; | |
}<?xml version='1.0' encoding='UTF-8' ?> | |
<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"> | |
@ListChildNodes(Umbraco.TypedContent(UmbracoContext.Current.PageId).AncestorOrSelf(1)) | |
</urlset> | |
@helper ListChildNodes(IPublishedContent startNode) | |
{ | |
foreach (var node in startNode.Children.Where("hideInXmlSitemap == false")) | |
{ | |
if (node.TemplateId > 0) | |
{ | |
<url> | |
<loc>@GetUrlWithDomainPrefix(node.Url)</loc> | |
<lastmod>@(string.Format("{0:s}+00:00", node.UpdateDate))</lastmod> | |
</url> | |
} | |
if (node.Level <= 100 && node.Children.Count() > 0) | |
{ | |
@ListChildNodes(node) | |
} | |
} | |
} | |
@functions { | |
private static string GetUrlWithDomainPrefix(string url) | |
{ | |
if (url.StartsWith("/")) | |
url = url.Substring(1); | |
var domainPrefix = string.Format("http://{0}/", HttpContext.Current.Request.ServerVariables["HTTP_HOST"]); | |
if (url.StartsWith(domainPrefix)) | |
return url; | |
else | |
return domainPrefix + url; | |
} | |
} |
shouldn't be there also a record for the root site before
@ListChildNodes(Umbraco.TypedContent(UmbracoContext.Current.PageId).AncestorOrSelf(1))
?
right now it's starting from first child of the root, skipping the root itself
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The suggestion to use
node.UrlWithDomain()
by @BarryFogarty works well, and cleans up the code a good deal.The change I made was to add two properties to most document types: ShowInXmlSitemap and ShowChildrenInXmlSitemap. if either of those properties is true, enter the for loop. if the first is true, output the current node. if the latter is true, loop through the child nodes. We defaulted the ShowInXmlSitemap to true for the non-xml sitemap document type you mentioned in your blog post.
This was necessary in our case because we have situations where we have a content page with several pieces of content under it, but they are merely rendered as content on the parent page. that allows us to disable the child content from producing their own sitemap nodes. In another case, we have a blog parent and both that page and all children should generate nodes.
This combination also helps with short circuiting how deeply the node inspection will go.
Thanks @alindgren for offering a great solution.