Skip to content

Instantly share code, notes, and snippets.

@jonathanread
Last active January 29, 2020 13:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonathanread/4f9e903741c385567f85f87456484b91 to your computer and use it in GitHub Desktop.
Save jonathanread/4f9e903741c385567f85f87456484b91 to your computer and use it in GitHub Desktop.
private static void Bootstrapper_Bootstrapped(object sender, EventArgs e)
{
//Register pre render event to add meta data for pages
EventHub.Subscribe<IPagePreRenderCompleteEvent>(PageMetaDataHelper.OnPagePreRenderCompleteEventHandler);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Telerik.Sitefinity.Services;
using Telerik.Sitefinity.Web.Events;
using Telerik.Sitefinity.Libraries.Model;
using System.Web.UI;
using System.Web.UI.HtmlControls;
namespace CLane.Extensions.Pages
{
public static class PageMetaDataHelper
{
/// <summary>
/// Page prerender event to handle placing the meta tags
/// </summary>
/// <param name="evt">Prerender event</param>
public static void OnPagePreRenderCompleteEventHandler(IPagePreRenderCompleteEvent evt)
{
TryAddMetaField(evt, "og:title", "OGTitle");
TryAddMetaField(evt, "og:description", "OGDescription");
TryAddMetaField(evt, "og:image", "OGImage");
string ogSiteName = "og:site_name";
if (!DoesTagExist(evt.Page, ogSiteName))
{
evt.Page.Header.Controls.Add(BuildOGMetaTag(ogSiteName, SystemManager.CurrentContext.CurrentSite.Name));
}
string ogUrl = "og:url";
if (!DoesTagExist(evt.Page, ogUrl))
{
evt.Page.Header.Controls.Add(BuildOGMetaTag(ogUrl, SystemManager.CurrentHttpContext.Request.Url.ToString()));
}
}
/// <summary>
/// Try to add meta field to head
/// </summary>
/// <param name="evt">Prerender event</param>
/// <param name="metaFieldIdentifier">Meta field identifier</param>
/// <param name="pageFieldIdentifier">Sitefinity page field/property name</param>
private static void TryAddMetaField(IPagePreRenderCompleteEvent evt, string metaFieldIdentifier, string pageFieldIdentifier)
{
var page = evt.Page;
var pageNode = evt.PageSiteNode;
var field = pageNode.GetCustomFieldValue(pageFieldIdentifier);
string fieldValue = string.Empty;
if (field is string)
{
fieldValue = field as string;
}
else if (field is Image img)
{
if (img != null)
{
fieldValue = img.Url;
}
}
if (!fieldValue.IsNullOrWhitespace() && !DoesTagExist(page, metaFieldIdentifier))
{
page.Header.Controls.Add(BuildOGMetaTag(metaFieldIdentifier, fieldValue));
}
}
/// <summary>
/// Does the tag already exist in the page header
/// </summary>
/// <param name="page">Page being rendered</param>
/// <param name="tagPropertyTitle">Meta tag property title</param>
/// <returns>If the tag already exists in the page header</returns>
private static bool DoesTagExist(Page page, string tagPropertyTitle)
{
//Sitefinity adds it's OG tags via literals, so we check them here
return page.Header.Controls.OfType<LiteralControl>().Any(control => control.Text.Contains(tagPropertyTitle));
}
/// <summary>
/// Build out meta tag for insertion
/// </summary>
/// <param name="property">Meta property name</param>
/// <param name="content">Value of meta field</param>
/// <returns>HtmlMeta tag element</returns>
private static HtmlMeta BuildOGMetaTag(string property, string content)
{
var meta = new HtmlMeta() { Content = content };
meta.Attributes.Add("property", property);
return meta;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment