17 Nov 2016
If you have a blog, or a site with news articles, or even a podcast site, you will probably need to have an RSS feed set up.
And if you use Umbraco CMS then this is the post for you. In this post I give you a simple template to start using for your own feed. It's very simple and straight forward. It should be a simple case of copy > paste > edit > save > job done.
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage @{ Layout = null; Response.AddHeader("Content-Type", "text/xml"); const string DATE_FORMAT = "ddd, dd MMM yyyy hh:mm:ss zzz"; const string FEED_TITLE = "codeshare.co.uk Blog"; const string FEED_DESCRIPTION = "codeshare.co.uk Blog | Code examples and knowledge sharing"; const string CREATOR_NAME = "Paul Seal"; const string CATEGORY = "Web Development"; const string UPDATE_PERIOD = "daily"; const int UPDATE_FREQUENCY = 1; const string LANGUAGE = "en-US"; const string HOME_PAGE_DOC_TYPE_ALIAS = "home"; const string FEED_PARENT_DOC_TYPE_ALIAS = "blog"; const string ARTICLE_DOC_TYPE_ALIAS = "blogPost"; const string ARTICLE_TITLE_PROPERTY_ALIAS = "pageTitle"; const string ARTICLE_DATE_PROPERTY_ALIAS = "blogPostDate"; const int CONTENT_PREVIEW_LENGTH = 500; IPublishedContent homePage = Model.Content.AncestorOrSelf(1).DescendantsOrSelf().Where(x => x.DocumentTypeAlias == HOME_PAGE_DOC_TYPE_ALIAS).FirstOrDefault(); IPublishedContent feedParentPage = homePage.Descendants().Where(x => x.DocumentTypeAlias == FEED_PARENT_DOC_TYPE_ALIAS).FirstOrDefault(); IEnumerable<IPublishedContent> feedItems = feedParentPage.Descendants().Where(x => x.DocumentTypeAlias == ARTICLE_DOC_TYPE_ALIAS && x.IsVisible()).OrderByDescending(x => (DateTime)x.GetPropertyValue(ARTICLE_DATE_PROPERTY_ALIAS)); DateTime lastBuildDate = feedItems.Max(x => x.UpdateDate); string siteUrl = homePage.UrlWithDomain(); string feedUrl = ((IPublishedContent)CurrentPage).UrlWithDomain(); } <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"> <channel> <title>@FEED_TITLE</title> <atom:link href="@feedUrl" rel="self" type="application/rss+xml" /> <link>@feedParentPage.UrlWithDomain()</link> <description>@FEED_DESCRIPTION</description> <lastBuildDate>@lastBuildDate.ToString(DATE_FORMAT)</lastBuildDate> <language>@LANGUAGE</language> <sy:updatePeriod>@UPDATE_PERIOD</sy:updatePeriod> <sy:updateFrequency>@UPDATE_FREQUENCY</sy:updateFrequency> @foreach (IPublishedContent item in feedItems.OrderBy(ARTICLE_DATE_PROPERTY_ALIAS + " desc")) { string articleDescription = Umbraco.Truncate(umbraco.library.StripHtml(item.GetGridHtml("contentGrid", "bootstrap3").ToString()), CONTENT_PREVIEW_LENGTH).ToString().Replace("…", "..."); @:<item> <title>@(item.HasProperty(ARTICLE_TITLE_PROPERTY_ALIAS) ? item.GetPropertyValue<string>(ARTICLE_TITLE_PROPERTY_ALIAS) : item.Name)</title> @:<link> @umbraco.library.NiceUrlWithDomain(item.Id) @:</link> <pubDate>@(((DateTime)item.GetPropertyValue(ARTICLE_DATE_PROPERTY_ALIAS)).ToString(DATE_FORMAT))</pubDate> <dc:creator><![CDATA[@CREATOR_NAME]]></dc:creator> <category><![CDATA[@CATEGORY]]></category> <guid isPermaLink="false">@item.UrlWithDomain()</guid> <description><![CDATA[@articleDescription]]></description> @:</item> } </channel> </rss>
Have a look at this video where I try to implement the sample code on the default starter site you get with Umbraco.
If you want to be notified when I post new videos, click on subscribe in my author block below this post.
If you are stuck, please don't hesitate to ask your question in the comments.