<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel xmlns:blog="http://www.dotnetnuke.com/blog/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
    <title>Crafty Code</title>
    <description>The craft of writing code.  The outcomes from being crafty with code.  Crafty Code is tales from the coding bench.</description>
    <link>http://www.ifinity.com.au/Blog/Crafty_Code</link>
    <language>en-US</language>
    <webMaster>http://www.ifinity.com.au/Contact_Us</webMaster>
    <pubDate>Sun, 05 Feb 2012 06:52:26 GMT</pubDate>
    <lastBuildDate>Sun, 05 Feb 2012 06:52:26 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 4.1.0.0</generator>
    <item>
      <title>New Skin Objects for including jQuery, Javascript and CSS Stylesheets in DotNetNuke Skins</title>
      <link>http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins</link>
      <description>&lt;p&gt;This blog post brings together two threads of thought that I have been thinking about.   The first is related to my recent blog post &lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions" target="_blank"&gt;Implementing jQuery and Javascript Libraries across DotNetNuke versions&lt;/a&gt;, and the second was a conversation with &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/BlogId/18.aspx" target="_blank"&gt;Scott Willhite&lt;/a&gt; at DotNetNuke World, who asked me why I hadn’t actually ever published anything in the &lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge.aspx" target="_blank"&gt;DotNetNuke Forge&lt;/a&gt; despite writing lots of stuff.  I didn’t really have a satisfactory answer that didn’t involve using an excuse of inertia or procrastination.&lt;/p&gt;  &lt;p&gt;My prior post on jQuery and Javascript implementation has been pretty widely read, and one of the comments on twitter was thus:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://twitter.com/#!/nokiko/status/148879339834970112"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" border="0" src="/portals/0/images/skin-js-include.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So as two things lead to one, I decided to create a set of skin objects that would incorporate the work on jQuery and Javascript libraries into re-usable skin objects and create that as a DotNetNuke forge project.&lt;/p&gt;  &lt;p&gt;I already had an older freebie project called iFinity SkinObjects but most of the innovations in that have now been adopted in the DotNetNuke core (nofollow on privacy/terms links, correct home page Url on the Logo, etc).  The SkinObjects project was also written in VB which was now out-of-step with the DotNetNuke core.&lt;/p&gt;  &lt;p&gt;So what I did was create an entirely new project, which I called DotNetNuke.SkinObjectsEx, or ‘Extra Skin Objects’ if you want the friendly name.&lt;/p&gt;  &lt;p&gt;This has been created as a &lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge/view/ProjectDetail/id/928.aspx"&gt;DotNetNuke Forge project&lt;/a&gt;, which has it’s associated &lt;a href="http://dnnskinobjectsex.codeplex.com/"&gt;Codeplex Project page&lt;/a&gt;.  You can download the install package, example skin and Source code from these locations.&lt;/p&gt;  &lt;h2&gt;What’s in the box?&lt;/h2&gt;  &lt;p&gt;The SkinObjectsEx project contains 4 separate skin objects to use within your DotNetNuke skins.  It comes in an installable DotNetNuke Extension Zip package which is installed as normal.&lt;/p&gt;  &lt;h3&gt;Script &lt;/h3&gt;  &lt;p&gt;The script object allows you to link a javascript file into your skin in a way that is safe for all DotNetNuke versions, and in a way that will leverage the increasing client-site functionality that has been gradually appearing since DotNetNuke 5.0 came out.&lt;/p&gt;  &lt;p&gt;The Script object is also a simple way to ensure that both jQuery and jQuery UI are registered on the page in a DotNetNuke-safe way.  I have seen many, many errors created on sites due to hard-coded jQuery or jQuery UI references into a skin, which then cause problems when new modules or DotNetNuke upgrades are introduced.  This saves the skin author having to devolve into code-behind code, when they can just include a simple reference and be certain the correct version of jQuery is going to be registered on the site.&lt;/p&gt;  &lt;h3&gt;Stylesheet&lt;/h3&gt;  &lt;p&gt;The Stylesheet object is modelled on the standard DNN Styles object, but again brings in the compatibility with the DotNetNuke Client Resource Management framework in order to combine stylesheets for faster performance – in a way that works with all DotNetNuke versions.   In addition, the Stylesheet skin object introduces the ability to link CSS files only for specific DNN versions.  This is done in a from/to pattern, so that you can have one CSS File included up until, say, version 5.6, and another CSS File included from, say, 6.0.   This power allows a skin author to tailor different approaches to different DNN versions, which is very important with the introduction of jQuery UI in DNN 6, which brought a lot of standard CSS definitions with it.&lt;/p&gt;  &lt;h3&gt;PageLink&lt;/h3&gt;  &lt;p&gt;The PageLink skin object provides a simple way to create a link to a specific page in your DotNetNuke site.  While this sounds very simple, in reality skins are often developed away from the intended site, and hard-coding a Url into the skin creates a brittle implementation that is easy to break, and is usually done in a way that doesn’t leverage the proper DotNetNuke Friendly Url API accessed through the NavigateUrl() call.&lt;/p&gt;  &lt;h3&gt;Portal Date&lt;/h3&gt;  &lt;p&gt;This is an old one from the original Skin Objects project, and provides a simple way to add the current date or time to every page in the site.  The most important part of this is that it loads up the localised portal date/time, rather than the date/time of the server which it is running on.  For people who have their site hosted in a different timezone to their intended hosting locality, it’s a neat little way to make things look right.&lt;/p&gt;  &lt;p&gt;In addition to the above objects, the CodePlex downloads include a variation of the DotNetNuke 6 ‘DarkKnight’ skin, which includes implementation of all of the above skin objects in an example.&lt;/p&gt;  &lt;p&gt;This blog post will focus on the Script and Stylesheet skin objects from this point on.  &lt;/p&gt;  &lt;h2&gt;Using the Script Object&lt;/h2&gt;  &lt;p&gt;Adding the Skin Object to a DNN Skin is done like this:&lt;/p&gt;  &lt;p&gt;First, you register the skin object in the skin:&lt;/p&gt;  &lt;p&gt;&lt;%@ Register TagPrefix="dnn" TagName="SCRIPT" Src="~/DesktopModules/SkinObjectsEx/Script.ascx" %&gt;&lt;/p&gt;  &lt;p&gt;Then, for each Script library you want referenced on the generated page, you add a new Skin object:&lt;/p&gt;  &lt;p&gt;&lt;dnn:SCRIPT id="jquery" ScriptType="jQuery" runat="server" /&gt;   &lt;br /&gt;&lt;dnn:SCRIPT id="jqueryUI" ScriptType="jQueryUI" runat="server" /&gt;    &lt;br /&gt;&lt;dnn:SCRIPT id="cycle" ScriptType="other" Path="skin" Location="jquery.cycle.min.js" name="jquery_cycle" InHeader="false" Order="e_Default"  runat="server"/&gt;    &lt;br /&gt;&lt;dnn:SCRIPT id="hoverintent" ScriptType="other" Path="relative" location="~/Resources/Shared/Scripts/jquery/jquery.hoverIntent.min.js" name="hoverintent" Order="e_Default" runat="server" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The above example shows 4 different Scripts to be included on the output page.  The first is a request for the jQuery library.  The second is a request for the jQuery UI library.  The last two are references to the ‘jquery.cycle.min.js’ and ‘jquery.hoverintent.min.js’ libraries which are referenced in the ‘DarkKnight’ skin.  &lt;/p&gt;  &lt;p&gt;The final two references replace this in the standard DNN 6 DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;script type="text/javascript" src="&lt;%=SkinPath %&gt;jquery.cycle.min.js"&gt;&lt;/script&gt;   &lt;br /&gt;&lt;script runat="server"&gt;    &lt;br /&gt;  'for mega menu we need to register hoverIntent plugin, but avoid duplicate registrations    &lt;br /&gt;  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    &lt;br /&gt;    Page.ClientScript.RegisterClientScriptInclude("hoverintent", ResolveUrl("~/Resources/Shared/Scripts/jquery/jquery.hoverIntent.min.js"))    &lt;br /&gt;  End Sub    &lt;br /&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;There are 6 different properties in the Script object, all of which combine to control the behaviour of the way the final script is linked on the output page.&lt;/p&gt;  &lt;p&gt;The properties are:&lt;/p&gt;  &lt;h3&gt;ScriptType &lt;/h3&gt;  &lt;p&gt;ScriptType controls the type of script the skin object uses.  There are three choices: ‘jQuery’, ‘jQueryUI’,’other’.  The first two should be obvious – they just include a reference to the jQuery and jQueryUI libraries accordingly.  The ‘other’ is anything else, apart from jQuery.  You don’t need to include this value for ‘other’ types, as ‘other’  is the default.&lt;/p&gt;  &lt;p&gt;Looking back at the prior example, you can see how the ScriptType is used in the 4 different examples.&lt;/p&gt;  &lt;p&gt;Path&lt;/p&gt;  &lt;p&gt;Path is also a value with set values.  These are ‘Skin’, ‘Absolute’ and ‘Relative’.  When using a path type of ‘Skin’, the library is referenced from the installed skin path.  When using a path type of ‘Absolute’, the library is reference from the absolute location specified.  When using ‘Relative’, the location is specified with a tilde (~) and is passed into the ‘ResolveUrl’ function to create a fully qualified path.   In the above examples, you can see how the ‘hoverintent.js’ skin object replaces the included ‘code behind’ in the skin files.&lt;/p&gt;  &lt;h3&gt;Location&lt;/h3&gt;  &lt;p&gt;Location is the component that combines with the ‘Path’ value to create the fully reference Url.   For Path=”Skin” location is just the relative path in the Skin directory (ie, where the skin is installed).   For Path=”Absolute”, Location is the fully qualified Url to the file.  For ‘Relative’, location is the relative Url that ASP.NET will resolve at runtime.&lt;/p&gt;  &lt;h3&gt;Name&lt;/h3&gt;  &lt;p&gt;Name is just a unique identifier that ensures that the script is not added twice in the one page.&lt;/p&gt;  &lt;h3&gt;Order&lt;/h3&gt;  &lt;p&gt;Order is used for DNN 6.1+ installations, and determines where in the list of resources the item is inserted.  These values come from the earlier work done in the &lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions"&gt;jQuery and Javascript Libraries in DotNetNuke&lt;/a&gt; post already referenced.  &lt;/p&gt;  &lt;p&gt;The values for Order are:&lt;/p&gt;  &lt;p&gt;a_BeforejQuery, b_BeforeDnnXml, c_BeforeDomPositioning, d_BeforeDnnControls, e_Default&lt;/p&gt;  &lt;p&gt;The alphabetic prefix just helps with understanding the overall order of things.  This allows you to control where in the hierarchy of scripts your linked script will appear.&lt;/p&gt;  &lt;h3&gt;InHeader&lt;/h3&gt;  &lt;p&gt;This is a boolean value which controls whether or not to include the header within the &lt;head&gt; section of the Html, or whether to include it in the &lt;body&gt; section.  In some cases, this will be overridden by the logic contained within the code, to prevent quirks for individual DNN Versions from breaking your javascript.  These are always moving from &lt;head&gt; to &lt;body&gt;, and only apply to the jQuery and jQuery UI usage.&lt;/p&gt;  &lt;h2&gt;StyleSheet&lt;/h2&gt;  &lt;p&gt;The StyleSheet skin object uses a similar approach to the Script object in that it uses the same logic to seamlessly integrate regardless of the installed DotNetNuke version.&lt;/p&gt;  &lt;p&gt;Here’s a reference as shown in the example DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;%@ Register TagPrefix="dnn" TagName="STYLESHEET" Src="~/DesktopModules/SkinObjectsEx/StyleSheet.ascx" %&gt;&lt;/p&gt;  &lt;p&gt;and the skin object usage:&lt;/p&gt;  &lt;p&gt;&lt;dnn:STYLESHEET runat="server" id="StylesIE7Ex" Name="IE7MinusEx" path="skin" location="ie7skin.css" Condition="LT IE 8" Order="c_BeforeSkin" InHeader="true" /&gt;&lt;/p&gt;    &lt;p&gt;Note that this replaces the DNN STYLES reference in the DNN 6 DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;dnn:STYLES runat="server" ID="StylesIE7" Name="IE7Minus" StyleSheet="ie7skin.css" Condition="LT IE 8" UseSkinPath="true"/&gt;&lt;/p&gt;  &lt;p&gt;On first glance these would appear to be the same, and they largely are (the STYLESHEET object is a fork of the STYLES code).   However, the StyleSheet skin object has some big advantages:   &lt;br /&gt;- it will utilise the DotNetNuke Client Resource Management (aka &lt;em&gt;imbibe&lt;/em&gt;) framework to combine all stylesheets into a single downloadable file, if it is available&lt;/p&gt;  &lt;p&gt;- it allows you to specify &lt;em&gt;FromVersion&lt;/em&gt; and &lt;em&gt;ToVersion&lt;/em&gt; properties which controls whether or not to include the stylesheet with a particular version or range of DNN versions.  This allows the skin author to have a single installable skin that has a different stylesheet for, say, DNN 6 and DNN 5.&lt;/p&gt;  &lt;p&gt;Here are the properties for the StyleSheet object:   &lt;br /&gt;Condition&lt;/p&gt;  &lt;p&gt;Carried over from the Styles object, the condition allows you to add a CSS Condition which helps to determine usage for particular browsers&lt;/p&gt;  &lt;h3&gt;Media &lt;/h3&gt;  &lt;p&gt;This property is carried over from the Styles object, and allows you to specify the media attribute for the stylesheet.&lt;/p&gt;  &lt;h3&gt;Name&lt;/h3&gt;  &lt;p&gt;The Name property uniquely identifies a stylesheet so that a single version is implemented per page&lt;/p&gt;  &lt;p&gt;Path&lt;/p&gt;  &lt;p&gt;The Path location works the same as the Script object, in that it has a choice of Absolute/Relative and Skin.  This controls the references of the Location property.&lt;/p&gt;  &lt;h3&gt;Location&lt;/h3&gt;  &lt;p&gt;As with the Script object, the Location is used to combine with the Path value, and determine the actual Url of the stylesheet.  See the Script definition for ‘Location’ above for more information.&lt;/p&gt;  &lt;h3&gt;Order&lt;/h3&gt;  &lt;p&gt;As with the Script object, the Order path allows you to specify a particular insertion order for a stylesheet.  Note this value only works for DNN 6.1+ versions, and is ignored in prior DNN versions (in these cases, order is determined by the execution order, ie, the location on the skin file).   The values for order are:&lt;/p&gt;  &lt;p&gt;a_BeforeDefault, b_BeforeModule, c_BeforeSkin, d_BeforeContainer, e_BeforePortal, f_Last&lt;/p&gt;  &lt;p&gt;These are entered as a string property value, which then converts them to a numeric value.&lt;/p&gt;  &lt;h3&gt;FromVersion / ToVersion&lt;/h3&gt;  &lt;p&gt;These two properties allow you to specify from and to DNN Versions.  If the currently executing DNN version falls greater than or equal to the FromVersion value, and less than or equal to the ToVersion value, the file will be included.   You do not need both, but can specify both.  So you can have a ‘FromVersion=”6.0"’ to always include the CSS File from Version 6, or you can have ‘FromVersion=”5.5” ToVersion=”5.7” to only use the file in versions 5.5, 5.6 and 5.7 (although 5.7 doesn’t exist).  And you can have a single version like ‘ToVersion=”5.4”’ to include the file up to the 5.4 version.&lt;/p&gt;  &lt;p&gt;The format allows you to specify any level of detail, so you can say ‘FromVersion=”6”’ which is just the major build version, or you can qualify to the minor version (“6.1”) or down to the revision value (“6.1.1”).  The system will automatically take the value down to the lowest value for any part of the version that isn’t supplied.  So “6” is represented as “6.0.0” and “6.1” is represented as “6.1.0”.&lt;/p&gt;  &lt;p&gt;That’s all there is to it!  As the entire component is built without the usual iFinity branding I include, and is distributed under the same free licence as DotNetNuke, any skin developers can integrate these features into not only custom skins for particular clients, or into distributable skins they sell on Snowcovered or elsewhere.&lt;/p&gt;  &lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;  &lt;p&gt;I’m guessing at some questions here as I haven’t really spoken to anyone about this, but here goes:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why wouldn’t I just use the &lt;em&gt;DnnJsInclude&lt;/em&gt; and &lt;em&gt;DnnCssInclude&lt;/em&gt; skin objects in DNN 6.1?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;These are the future path for everyone targeting 6.1+ DNN releases, and work well and are fully integrated into the &lt;em&gt;Imbibe&lt;/em&gt; framework.  However, in the messy real world of DNN installs, not everyone is up to date on the latest release, and building a skin to suit both current installs and future DNN 6 upgrades is tricky.  The approach in this project gives the best of both worlds : simple JS and CSS inclusion now, and a seamless future upgrade path for when the client finally brings their install up to date in DNN 6.&lt;/p&gt;  &lt;p&gt;It also suits those who want to sell/distribute a DNN 6.1 compatible skin now, but not close themselves off to those who are still running DNN 5.  &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why would you include a Script object of ScriptType=”jQuery” – even in DNN 5, this was included?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;It’s true that DNN5 shipped with jQuery, however, it’s possible that a specific page doesn’t have the jQuery library referenced.  This is because the DNN code – somewhere in the page execution – has to call the jQuery registration code.   The Script skin object with ‘ScriptType=”jQuery”’ will guarantee to the skin developer that jQuery is reference on the output page, &lt;em&gt;no matter what the installed DNN version is&lt;/em&gt;.  That way no skin developer should ever have to include the jQuery library themselves.   &lt;/p&gt;  &lt;p&gt;The same goes for the jQuery UI library – which is included in DNN 6 but not DNN 5.  By including a ‘ScriptType=”jQueryUI”’ Script skin object, you can be sure of a reference to jQuery UI being included on your output page, no matter if it is DNN5 or DNN6, and you can be guaranteed not to have a duplicate jQuery UI reference in DNN 6.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;What about DNN 4?  Is this compatible?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The project is compiled against DNN 5.1.2 so can’t be used on earlier versions.  You shouldn’t be doing DNN 4 stuff, really, it’s way out of date.  However, if the powers-that-be control your DNN life and DNN 4 is it, you can probably change the reference and recompile to a DNN 4 version. It should still work OK.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why would I want different CSS references for different DNN Versions&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The inclusion of jQuery UI and the extensive use (and redefinition) of jQuery UI components (like the &lt;em&gt;jQuery UI Tabs&lt;/em&gt; CSS classes) means that, for example, a CSS Class built for a DNN 5 skin might not layout properly when installed on a DNN 6 install.  A skin designer wishing to make a cross-version compatible skin can use this component to run slightly different CSS files for 5 and 6, and their clients won’t know the difference – and perhaps most importantly – won’t ring them in the middle of the night after upgrading their DNN install and finding their layout all broken (or is it just me that doesn’t share a timezone with &lt;em&gt;anyone else in the world&lt;/em&gt;)&lt;/p&gt;  &lt;p&gt;&lt;u&gt;What’s with this ‘Imbibe’ stuff?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;This is my little personal crusade towards better project naming.  I mean ‘DotNetNuke Client Resource Management Framework’ – that’s a mouthful of syllables, and distinctly Acronym-challenged (DCRMF?).  So I called it Imbibe and hope it catches on.  It won’t, of course, but if anyone ever comes up to me one day and goes ‘I’ve got a question about &lt;em&gt;Imbibe&lt;/em&gt; for you’ I will give them a little &lt;em&gt;high-five&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;Of course, with all those FAQ’s answered, please feel free to hit me up with more questions in the comments below, or in the CodePlex project.  This is my first Forge project released into the wild, so please give valuable feedback to get it up and running and living an independent life in the DNN ecosystem.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins</guid>
      <pubDate>Thu, 05 Jan 2012 02:33:23 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=141</trackback:ping>
    </item>
    <item>
      <title>Improve Urls for the Ventrian News Article Module with the News Articles Friendly Url Provider</title>
      <link>http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider</link>
      <description>&lt;p&gt;The big change for &lt;a href="http://www.ifinity.com.au/2011/10/26/Announcing_Url_Master_25_The_Next_Generation_in_DotNetNuke_Urls" target="_blank"&gt;Url Master 2.5&lt;/a&gt; was the inclusion of the ability to build custom module providers for &lt;a href="http://www.ifinity.com.au/2011/10/26/Build_your_own_Custom_DotNetNuke_Module_Provider_and_start_creating_the_Friendly_Urls_you_need_for_your_SEO_strategy" target="_blank"&gt;generating module-specific Friendly Urls&lt;/a&gt;.  Part of this strategy was to develop a set of module providers for popular third-party modules.  This kicked off with the &lt;a href="http://www.ifinity.com.au/2011/10/26/New_Custom_Url_Provider_creates_Friendly_Urls_for_the_DotNetNuke_Blog_Module" target="_blank"&gt;DotNetNuke Blog module provider&lt;/a&gt;.   &lt;/p&gt;  &lt;p&gt;The next module provider to be developed is the News Articles Friendly Url Provider, which transforms the Urls generated and used by the &lt;a href="http://www.ventrian.com/Products/Modules/NewsArticles.aspx" target="_blank"&gt;Ventrian News Articles module&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The new provider is a plug-in for the Url Master module, and provides seamless and easy-to-use features that completely change the way News Articles Urls look.&lt;/p&gt;  &lt;h2&gt;Improvements to Article Urls&lt;/h2&gt;  &lt;p&gt;Consider this Url which is generated by installing the News Articles module on a fresh DotNetNuke 6 installation:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/ArticleView/23/The-Title-of-the-Article.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/ArticleView/23/The-Title-of-the-Article.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;By implementing the Url Master module, plus the News Articles Friendly Url Provider, and setting a few options*, the above Url can be changed to this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/the-title-of-the-article"&gt;http://example.com/the-title-of-the-article&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Yes&lt;/em&gt;, you read that right, that’s how short you can get the Url.&lt;/p&gt;  &lt;p&gt;But maybe you use the News Articles module as a blog, and you want some Urls that make it clearly identifiable as a blog.  Change the options **,  and you can have your Url look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/2011/12/15/the-title-of-the-article"&gt;http://example.com/2011/12/15/the-title-of-the-article&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(incidentally, this matches the style of Url this blog now uses)&lt;/p&gt;  &lt;p&gt;*options used in first Url : Url Master – spaces replaced with hyphens, converted to lower case, no page extensions.  News Articles Friendly Url Provider – ‘Article Style’ Urls, Don’t show DNN Page path in Url.&lt;/p&gt;  &lt;p&gt;** options used in second Url : as per first Url, but using ‘Blog Style’ Urls instead of ‘Article Style’&lt;/p&gt;  &lt;h2&gt;Other News Articles Urls&lt;/h2&gt;  &lt;p&gt;Of course, the articles Urls aren’t the only ones.  There are Author Urls, Archive Urls and Page Urls.&lt;/p&gt;  &lt;h3&gt;Page Urls&lt;/h3&gt;  &lt;p&gt;Page urls are for when you have more than one page in your Article.  You have a choice here – either go with the unique title of the page, like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/the-second-page-of-the-article"&gt;http://example.com/the-second-page-of-the-article&lt;/a&gt; , or go with a page numbering scheme, like this : &lt;a href="http://example.com/the-title-of-the-article/p/2"&gt;http://example.com/the-title-of-the-article/p/2&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The choice is yours – either go for a simple page numbering scheme, or create specific unique page Urls to optimise for the content on each page.&lt;/p&gt;  &lt;h3&gt;Author Urls&lt;/h3&gt;  &lt;p&gt;With the Author Urls (which list all articles written by a specific author) you change change between using the Author DotNetNuke username or the DotNetNuke displayname.&lt;/p&gt;  &lt;p&gt;So you can go from:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/AuthorView/AuthorId/13/bjones.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/AuthorView/AuthorId/13/bjones.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;to &lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/news-articles/bob-jones"&gt;http://example.com/news-articles/bob-jones&lt;/a&gt;  or &lt;a href="http://example.com/news-articles/bjones"&gt;http://example.com/news-articles/bjones&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Archive Urls&lt;/h3&gt;  &lt;p&gt;Archive Urls show the articles by their creation date.  Normally, you’d expect to see something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/ArchiveView/dateType/Month/year/2011/month/12/default.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/ArchiveView/dateType/Month/year/2011/month/12/default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Too long!  How about:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/2011/12"&gt;http://example.com/2011/12&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now that’s short and sweet!&lt;/p&gt;  &lt;h2&gt;How does it work?&lt;/h2&gt;  &lt;p&gt;Well, it’s simple really.  Assuming you’ve already got the Url Master module installed and configured, you just install the News Aricles Friendly Url Provider via the DotNetNuke extensions.   Activate the provider using the Admin-&gt;Portal Urls page, and then choose your options using the built-in provider Settings page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/portals/0/images/news-articles-provider-sett.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="" border="0" alt="News Articles Friendly Url Provider Settings Page" src="http://www.ifinity.com.au/portals/0/images/news-articles-provider-sett.jpg" width="640" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using this page, you just choose the different Url options for each page in your portal that has a News Articles module on it, apply the changes, and the Urls are instantly transformed.&lt;/p&gt;  &lt;h2&gt;What about my existing Articles?&lt;/h2&gt;  &lt;p&gt;The News Articles module has been around for a while, and there are many thousands of articles out there on the web already written.  Some have been around for a &lt;em&gt;long time&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;The last thing you want to do is break the Urls for these old articles, some of which have good search engine rankings.&lt;/p&gt;  &lt;p&gt;Of course, implementing this provider doesn’t stop those old articles from working.  They’ll still work as intended.  But you’ve got some options.&lt;/p&gt;  &lt;p&gt;Firstly : you can activate the ‘Redirect ‘old’ style Urls to newer Urls.  So if you implement the provider, all your ‘old’ Urls will be redirected across.&lt;/p&gt;  &lt;p&gt;Secondly : you can choose which article the new Urls will start from.  By default, this is id 0 – as in, all articles will use the new Ids.  But you can enter your last article created (say, 145) and then any article from 146 onwards will use the new format, and earlier articles will keep using the standard format.   This prevents having changes to existing articles and large-scale 301 redirects implemented and leaves articles ranking well in search engines as they are.  Naturally, the redirect functionality works with the starting Article ID.&lt;/p&gt;  &lt;h2&gt;Where to get the News Articles Friendly Url Provider&lt;/h2&gt;  &lt;p&gt;The News Articles Friendly Url provider is available from the &lt;a href="http://www.ifinity.com.au/Products/Ventrian_News_Articles_SEO_Url_Provider" target="_blank"&gt;News Articles Friendly Url Provider product page&lt;/a&gt;.  This is a licensed module, prices start from $30, but you can get a free Trial Licence by going to the &lt;a href="http://www.ifinity.com.au/Licensing/Product/iFinity.NewsArticlesFriendlyUrlProvider" target="_blank"&gt;licensing page&lt;/a&gt;.   That will give you the ability to install the provider, try it out and decide whether you like the new Urls.&lt;/p&gt;  &lt;p&gt;Online help for the module is provided through the &lt;a href="http://www.ifinity.com.au/Products/Knowledge_Base/News_Articles_Friendly_Url_Provider" target="_blank"&gt;News Articles Friendly Url Provider Knowledge Base&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The News Articles Friendly Url Provider is shown at the &lt;a href="http://url-master.com/News-Articles" target="_blank"&gt;Url Master demonstration site&lt;/a&gt;.  &lt;/p&gt;  &lt;h2&gt;Comments, Questions&lt;/h2&gt;  &lt;p&gt;This is a brand-new module hot off the coding bench, so if you have any comments or questions, please feel free to leave a comment below.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider</guid>
      <pubDate>Thu, 15 Dec 2011 00:11:55 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=140</trackback:ping>
    </item>
    <item>
      <title>Implementing jQuery, jQuery UI and Javascript libraries across DotNetNuke Versions</title>
      <link>http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions</link>
      <description>&lt;p&gt;DotNetNuke 6.0 brought jQuery UI directly into the framework as a ‘1st class’ DotNetNuke member.   It also allowed developers to request the DotNetNuke jQuery registration code instead of each developer independently including the library, which prevents multiple versions and the subsequent page errors this will create.  I have previously blogged about this in my post &lt;a href="http://www.ifinity.com.au/Blog/EntryId/121/Using-jQuery-UI-with-DotNetNuke-5-and-6-in-the-same-module" target="_blank"&gt;Using jQuery UI with DotNetNuke 5 and 6 in the same module&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;With the release of DotNetNuke 6.1, the new Client Resource Management (aka &lt;em&gt;imbibe&lt;/em&gt;) framework has been included.   This framework not only includes jQuery and jQuery UI in DotNetNuke, but it uses a client registration framework so that other libraries and Javascript files can be included in the correct order.  The best resource for this is Ian Robinson’s blog post : &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/EntryId/3226/jQuery-amp-jQuery-UI-in-DNN-6-1-0-and-6-1-1.aspx" target="_blank"&gt;jQuery &amp; jQuery UI in DotNetNuke 6.1 and 6.1.1&lt;/a&gt;.   Because all of the various scripts are then registered in a single place, the framework can then combine them into one large js file, which drastically improves client side performance.   You can read more about this in the DotNetNuke Wiki entry on the &lt;a href="http://www.dotnetnuke.com/Resources/Wiki/Page/Client-Resource-Management-API.aspx" target="_blank"&gt;Client Resource Management API&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The 6.1 changes are an exciting inclusion into the world of javascript management for DotNetNuke development, but many (if not most!) people are not yet building solutions that target the 6.1 environment exclusively.   If you’re currently building for an earlier environment which will (one day) be upgraded, or you’re building a module that may be applied against a range of DNN versions, then this blog post is for you.&lt;/p&gt;  &lt;p&gt;While my previous blog entry was about how to leverage the jQuery UI registration, I’m going to build upon this and provide a one-stop solution to all DNN / jQuery / Javascript / CSS needs.  This is simple a code file which you can include in your own project which will save you the hassle of going through and trying to write code to get jQuery to work for a specific version.  This code has the smarts to work around all of the DotNetNuke versions and register the libraries for you.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/LinkClick.aspx?link=downloads/ScriptController_01.zip&amp;tabid=69&amp;mid=381" target="_blank"&gt;Download the ScriptController Code&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;What the code does&lt;/h2&gt;  &lt;p&gt;The code hides away the different ways you must handle both jQuery and Javascript/Css File registration in your page.  It automatically chooses the best way to handle the request based on the current DNN version.  The code is backwards compatible to DotNetNuke 4.x versions, so you don’t need to reference the latest 6.1.1 DotNetNuke libraries in order to use the code (this is handled by reflection).   All this means you can compile in one version of the code and be confident it will run optimised for the DotNetNuke version it gets installed in.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="10" width="638"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="71"&gt; &lt;/td&gt;        &lt;td valign="top" width="120"&gt;DotNetNuke 4&lt;/td&gt;        &lt;td valign="top" width="118"&gt;DotNetNuke 5&lt;/td&gt;        &lt;td valign="top" width="121"&gt;DotNetNuke 6&lt;/td&gt;        &lt;td valign="top" width="129"&gt;DotNetNuke 6.1&lt;/td&gt;        &lt;td valign="top" width="77"&gt;DotNetNuke 6.1.1+&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;jQuery&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Uses Dnn jQuery Registration&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;jQuery UI&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;Javascript Libraries&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Registers script for body inclusion&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Registers Script for Head or Body inclusion&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;Css Files&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Registers file for head or body inclusion&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Registers file for head or body inclusion&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Above : Table of actions for code library.   To understand, look at the column as per the DNN version, then at the Row for the function you would use in your code.  Where they meet, this is the action that the code library does for you.  However, the function call (left hand side column) is the same for all versions, the complexity is hidden away for you.&lt;/p&gt;  &lt;p&gt;An Example:&lt;/p&gt;  &lt;p&gt;The following code snippet shows how, in the Page_Load of a module control, the above code library is called in order to setup the required client-side scripts and Css files.  The code library is called &lt;em&gt;&lt;strong&gt;ScriptController&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;  &lt;pre style="font-family: courier-new; font-size: 11px"&gt;
//now get the javascript in
ScriptController.InjectjQueryLibary(this.Page, true, true);
//module-specific jquery code
ScriptController.InjectJsLibrary(this.Page, "moduleEdit_js", this.ControlPath + "/js/moduleEdit.js", true, ScriptController.ScriptInjectOrder.e_Default);
//and get the css file in
ScriptController.InjectCssReference(this.Page, "moduleEdit_css", this.ControlPath + "/moduleEdit.css", true, ScriptController.CssInjectOrder.f_Last);
//and put in a pre-dnn 6 ui script plus the jquery tabs library
string preDnn6CssFile = this.ControlPath + "/ui-tabs.css";
ScriptController.InjectjQueryTabsCss(this.Page, preDnn6CssFile, null);&lt;/pre&gt;

&lt;p&gt;The above code shows the ScriptController library being used. The steps are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Inject the jQuery library reference.  This call gives you the option to include the jQuery UI library as well&lt;/li&gt;

  &lt;li&gt;Inject the moduleEdit.js Javascript library.  This call gives you the choice of whether to include the script in either the page &lt;head&gt; or &lt;body&gt;.  The ScriptController.ScriptInjectOrder is an enumerated type which gives you the choice of where in the overall page output the script should be located.  Note, however, that this only works for DNN 6.1+ versions – in earlier DNN versions this value will be ignored, and it’s pot luck which order your script comes out.&lt;/li&gt;

  &lt;li&gt;Inject the moduleEdit.css file.  This call, like the Js registration, gives you the ability to include the file in the &lt;head&gt; or &lt;body&gt;, and uses an enumerated type to give you the choice where in the page order the Css file gets registered, but again, only for DNN 6.1+.&lt;/li&gt;

  &lt;li&gt;Conditionally inject a Css File for the jQuery Tabs Css theme.  This call gives you the option of providing a pre-DNN 6 Css file which defines a custom jQuery UI Tabs style, and also a post-DNN 6 (ie, 6 and above) Css file for defining jQuery UI Tabs styles.   The reason for this is that DNN 6 has a built-in Tabs style for the various admin pages that use the jQuery UI Tabs, and this snippet is for a module edit page.  So, for pre-DNN 6 versions, it defines it’s own style (because DNN 5 doesn’t have a ‘tabs’ style), but for post-DNN 6 versions, it uses &lt;em&gt;null&lt;/em&gt;, which means just use the standard DNN 6 tabs style.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The built-in Enumerated types for ScriptInjectOrder and CssInjectOrder give the ability to conveniently broad-brush locate where in the script order you want the script to go.  This only works with DNN 6.1 because it requires the Client Resource Management API to do the work of locating the script.   The enumerated types are prefixed with a_, b_, c_ so you get an idea of the order of the libraries as they are output onto the page.&lt;/p&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;This code library is free for all to use and is licensed under the same licence as the DNN core.  So please take it and use it in your modules, projects and more.&lt;/p&gt;

&lt;p&gt;If you find any bugs or problems, please let me know so I can correct them.   If you come up with a better way of doing things, also let me know.  If there is sufficient interest it could be located on a public source solution.&lt;/p&gt;

&lt;p&gt;Using this approach will massively simplify the ability for developers to create multi-version code instead of having to try and step through all the minefields again.&lt;/p&gt;

&lt;p&gt;Questions/Comments/Brickbats and Bouquets through the comments below!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/LinkClick.aspx?link=downloads/ScriptController_01.zip&amp;tabid=69&amp;mid=381" target="_blank"&gt;Download the ScriptController Code&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions</guid>
      <pubDate>Mon, 05 Dec 2011 23:46:46 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=139</trackback:ping>
    </item>
    <item>
      <title>Google Secure Search Impacts Keyword Analysis for SEO and gives you (not provided) in Analytics - What you can do about it</title>
      <link>http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it</link>
      <description>&lt;p&gt;Something that quietly slipped past a lot of people at the start of November was the announcement from &lt;a href="http://googleblog.blogspot.com/2011/10/making-search-more-secure.html" target="_blank"&gt;Google that was rolling out SSL Search&lt;/a&gt; for all logged-in Google users.&lt;/p&gt;  &lt;p&gt;This can be broken down like this:&lt;/p&gt;  &lt;p&gt;- SSL Search means that the search session is conducted over https&lt;/p&gt;  &lt;p&gt;- logged-in Google users covers the universe of people who are logged into a google service, such as iGoogle, Google+, Gmail – plus a whole pile of others.&lt;/p&gt;  &lt;p&gt;- SSL Searches do not provide the Keyword data in the referer value for a click-through from Google&lt;/p&gt;  &lt;p&gt;This fact that SSL searches do not pass the search query data (ie, the keywords used) onto the site that is clicked on has a very large impact on Analytics packages, which collect that data and summarize it for analysis.&lt;/p&gt;  &lt;p&gt;This means that data using any Analytics package (not just Google Analytics) will &lt;a href="http://analytics.blogspot.com/2011/10/making-search-more-secure-accessing.html" target="_blank"&gt;no longer provide keyword data for some Google searches&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The justification given was that:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;As search becomes an increasingly customized experience, particularly for signed in users, we believe that protecting these personalized search results is important.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sounds good, right?  They just want to protect user privacy.&lt;/p&gt;  &lt;p&gt;Unfortunately for them, there is this little caveat:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;You will continue to see aggregate query data with no change, including visits from users who aren’t signed in &lt;em&gt;and visits from Google “cpc”.&lt;/em&gt; (italics mine)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I would find it much easier to swallow their line on protecting user privacy, except for the fact that they don’t want to protect the privacy when it comes to websites buying ads.  Privacy for the user is only a concern for free traffic, not for paid traffic – and most google users wouldn’t really be able to tell the difference.&lt;/p&gt;  &lt;p&gt;But it’s OK, Google tells us, because:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Keep in mind that the change will affect only a minority of your traffic&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Well, that’s very heartening for them.  As I noted previously, the change affects Google Analytics, which will no longer provide keyword data for anyone who is signed in.  Instead, you will get a value that says “(not provided)”.&lt;/p&gt;  &lt;p&gt;But if we take a look at the referral data for this site, we see that in the month of November, 2011:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; ‘not provided’ included 10% of all keyword searches used on the site&lt;/li&gt;    &lt;li&gt; ‘not provided’ is the keyword used for 71% of all new visits&lt;/li&gt;    &lt;li&gt; ‘not provided’ has a bounce rate of 69%&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So, for all these new visits to this site, I’m unable to :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt; Know what they were looking for&lt;/li&gt;    &lt;li&gt; Work out why they didn’t find what they wanted&lt;/li&gt;    &lt;li&gt; Improve the site content to make the site more valuable to these visitors.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;However, if I paid Google to run some keywords, they will happily give me all this detail.  It kind of flies in the face of the mantra given to people who want to work within Google guidelines of making sure you have relevant, quality content.&lt;/p&gt;  &lt;p&gt;For example, if I find this blog post becomes popular,  it will become very difficult to know whether this is because it contains information about Google Analytics, or because it contains information about the Google SSL Search.  So I won’t know if I should write more articles about one or the other.  Unless, of course, I go out and buy a heap of keywords to see which one works best – then I’ll know.  Imagine trying to run a retail store where you’re not allowed to ask the customer what they are looking for?  The whole idea is crazy.  A website still gets lots of detailed information about each visitor – right down to their location, device, whether they’ve visited before, what pages they read, what language they speak, but somehow it’s a violation of privacy to know what keyword they used? &lt;em&gt;Give me a break&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Now, some readers will realise this has turned into a bit of a rant, which is a bit uncharacteristic of this blog.   Let me establish up front that I respect that Google is a private company with a profit motive and, as such, are free to do whatever they want with their service.   But let me also state that this marks, to me, the official point where Google &lt;a href="http://en.wikipedia.org/wiki/Jumping_the_shark" target="_blank"&gt;jumped the shark&lt;/a&gt; and is no longer the benign, helpful, benevolent ‘don’t be evil’ web property we’ve all regarded them as for the last decade or so.   The sheer front of them saying it’s for privacy – unless you pay up, then we don’t care how much user data you get – reeks of the sort of thing you’d expect from a PR obsessed corporation or Government department.  I can take a lot of things on the chin, but treating people as non-thinking idiots with spin is one thing that doesn’t fly well for me.  Those of us from Down Under are fond of straight-talking and telling it like it is.&lt;/p&gt;  &lt;p&gt;It’s personally frustrating for me, because I have spent a lot of time over the years making DotNetNuke tools for free Google services (Analytics, Sitemaps, etc) only to find out that the key information I use for SEO on this – and any other site – is now to be gradually denied to me as an increasing amount of search comes from Google properties and signed in users.  But then I think if I’m honest I always knew that would be the case – a public company has a fiduciary duty to do it’s best to reward shareholders, and it would take a very strong-willed manager indeed to ignore the amount of cash Google has left lying on the table in the past.&lt;/p&gt;  &lt;p&gt;However, the key takeaway message here is that the ‘Don’t be evil’ motto is dead and buried, and we’re dealing with a monopolist every bit as powerful and intent on maximising it’s position as Microsoft did with it’s operating system lockout.  So everyone needs to start operating and making key decisions with that background.&lt;/p&gt;  &lt;p&gt;OK, so now what?&lt;/p&gt;  &lt;p&gt;Well, moving past the rant onto the action.    The simple fact is that a lot of us gain a large percentage of our traffic from Google web properties (and devices, too, viz Android) and so we’ve got to take what is given to us.  I’m itching to use more colorful language, but I’ll restrain myself.&lt;/p&gt;  &lt;p&gt;The rest of the post is dedicated to being pro-active about it and working out ways to ascertain the impact and think about new strategies.  After all, change implies opportunity, does it no?&lt;/p&gt;  &lt;h2&gt;Quantify the size of the problem&lt;/h2&gt;  &lt;p&gt;This means tracking the growth of ‘(not provided)’ searches over time.  If it’s at about 5% or so, and remains that way, it’s unlikely to cause too much bother over time.  The amount of signed-in searches will be highly correlated with your sources of traffic.  Basically, the more ‘tech savvy’ your audience, the more likely they’ll have a Google sign-in and be using it.  If it’s static, well, then you’ll just have to work with it.&lt;/p&gt;  &lt;p&gt;If the (not provided) keyword starts to grow, however, then you’ll need to start working out ways to try and ascertain the data.  This might mean doing your own analysis on the main keywords of a page, and then manually linking that to the page and assuming that the traffic the page is getting is from those keywords.  &lt;/p&gt;  &lt;p&gt;How to measure your (not provided) traffic.&lt;/p&gt;  &lt;p&gt;It’s easy to make the mistake of comparing apples with oranges.  First, only Google organic traffic is affected.  So you need to drill down in your reports, going into:&lt;/p&gt;  &lt;p&gt;&gt;Traffic Sources &gt;Sources &gt;Search &gt;Organic and then click on the (not provided) keyword.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-traffic.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="not-provided-keyword-traffic" border="0" alt="not-provided-keyword-traffic" src="/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-traffic_thumb.jpg" width="644" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above: ifinity.com.au (not provided) keyword impact, Oct/Nov 2011.&lt;/p&gt;  &lt;p&gt;If you have an even spread between different search providers (Google, Bing, Yahoo, etc) then you’ll need to filter out the other search traffic to get an accurate picture.  However, if, like my site, you get a massive majority of search traffic from Google (ie, 97%) then it really isn’t that important to filter out the other search traffic because it really isn’t material.&lt;/p&gt;  &lt;p&gt;Either way – the only thing that is important is that you are consistent over time – it’s about tracking trends, and the key feature in doing that is to have a consistent methodology of collecting the data.&lt;/p&gt;  &lt;h2&gt;Quantify the impact of the (not provided) traffic&lt;/h2&gt;  &lt;p&gt;Now that the number of ‘private’ searches is known – you can check it against performance of other groups of traffic.  This means looking at the ‘not provided’ traffic as an advanced segment, and checking it against other sources.&lt;/p&gt;  &lt;p&gt;To create an advanced segment, click on the ‘Advanced Segments’ section, click ‘add’ then just select ‘Keyword’ ‘Exactly Matching’ (not provided) and click ‘save segment’.  Give it a name like ‘(not provided) keywords’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-segment.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="not-provided-keyword-segment" border="0" alt="not-provided-keyword-segment" src="/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-segment_thumb.jpg" width="644" height="442" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above: Create a (not provided) keyword segment.&lt;/p&gt;  &lt;p&gt;Once this segment is created, you can look at any report in Analytics then use the ‘Compare’ function to match between this segment and the ‘All Visits’ segment (or, better still, the ‘Non-paid Search Traffic’ segment.&lt;/p&gt;  &lt;p&gt;Then you can apply these two segments to important metrics in your site, and see if the (not provided) traffic has a different profile:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image.png" width="417" height="115" /&gt;&lt;/p&gt;  &lt;p&gt;Above : Goal Conversion Rate Non-paid Search Traffic vs (not provided) keywords&lt;/p&gt;  &lt;p&gt;What this information tells me is that the (not provided) keywords follow a reasonably similar profile to all organic search traffic.  Which means I can reasonably deduce that the distribution of keywords I no longer get to see is somewhat similar to the distribution of keywords I do get to see.&lt;/p&gt;  &lt;p&gt;Taking this further, after reading this &lt;a href="http://www.kaushik.net/avinash/google-secure-search-keyword-data-analysis/" target="_blank"&gt;excellent blog post by Avinash Kaushik&lt;/a&gt;, who goes further into determining what is long tail and ‘head’, I decided to create two new custom segments in my analytics, one called ‘top 7 keywords’ and one called ‘long tail keywords’.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image_3.png" width="398" height="204" /&gt;&lt;/p&gt;  &lt;p&gt;These segments are created by looking at a trailing 12 month history of keywords, and creating one segment that only includes traffic using those keywords (the ‘head’) and one segment that excludes all traffic using those keywords (the ‘tail’).  The ‘head’ keywords are those that the site ranks very well for, and that are a clear intention of finding something on the site.  These might also be called ‘brand’ keywords – because they are invariably a combination of ifinity + product name.&lt;/p&gt;  &lt;p&gt;By applying this to the same Goal report, we can see that the (not provided) keywords perform much closer to the ‘long tail’ set than they do to ‘head’ set.  Which leads me to my conclusion that, at present,  the (not provided) keyword set is mostly long tail keywords and not brand keywords.&lt;/p&gt;  &lt;p&gt;This is re-inforced further by checking the bounce rate for all content:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image_4.png" width="367" height="197" /&gt;&lt;/p&gt;  &lt;p&gt;This shows that the bounce rate almost exactly matches the long tail keyword set.&lt;/p&gt;  &lt;p&gt;Conclusion from this : it would appear that most of the redacted keyword traffic is of the same nature as the overall site profile, and performs closely to the ‘long tail’ of keyword data.&lt;/p&gt;  &lt;p&gt;Action from this : monitor this over time (say, monthly) and see if any clear trends develop where this is no longer the case.  If, for instance, the ‘(not provided)’ set started to outperform or underperform, you might rightly conclude that there is something significant in the set that is different in makeup to the rest of the keyword data.&lt;/p&gt;  &lt;h2&gt;Looking for other data sources&lt;/h2&gt;  &lt;p&gt;Of course, all the information in the previous post is just a ‘calm down’ action to work out what is inside the box of keywords we are no longer allowed to open.  It doesn’t give us important data for tracking new keywords or developing themes presented in individual pages that perform well from search traffic (ie, hit the sweet spot of a high ranking in a well searched term).  This would be vitally important if your site had relatively ‘fresh’ content (say, a news site).  So what can you use?&lt;/p&gt;  &lt;p&gt;This is where Google has thrown us a scrap of information by integrating Webmaster Tools into Google Analytics.   This is a feature in the ‘new’ Analytics which has recently been rolled out.  If you use Google Analytics and haven’t been on in a while, you should check out the new ‘Search Engine Optimisation’ feature.  (&gt; Traffic Sources &gt; Search Engine Optimisation)&lt;/p&gt;  &lt;p&gt;In order to use this function, you have to integrate your webmaster profile into your analytics profile.  The webmaster profile can only be linked with a single Analytics profile.&lt;/p&gt;  &lt;p&gt;So what does this new data give us?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/google-search-query-data.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="google-search-query-data" border="0" alt="google-search-query-data" src="/Portals/0/images/383d8d6bb459_9475/google-search-query-data_thumb.jpg" width="644" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above : Search query data for ifinity.com.au.  &lt;/p&gt;  &lt;p&gt;Well, the cynic in me says a fat lot of pretty pictures with zero applicability to SEO.   But you have to move on with the times – this is the new way things are going to be done so you have to get smart and move forwards.&lt;/p&gt;  &lt;p&gt;There is a lot of junk data in here – I had no idea I was ranking for www.xxx.com (I’m guessing an adult site, I daren’t look) but throughout the forums on this site it’s a pattern people commonly use to redact the domain information when seeking help on Urls.  Of course it gets me no click-through traffic, which is why I’ve never noticed.  But it is noise that needs to get filtered out of the data in order to start working with the useful information.&lt;/p&gt;  &lt;p&gt;It’s important to realise that this data has been in Webmaster console for a while, but is now presented in an easy-to-access way alongside your Analytics data.  What we are looking at here is the google.com side of things  - how many impressions search terms had, how many clicks, and your sites average position for those impressions.  Finally it gives you a click-through-rate (CTR).&lt;/p&gt;  &lt;p&gt;While it’s not obvious at first glance, this is the reverse side of your keyword data on your site.  So when you have a suspicion that a particular keyword is performing well for you, you can go to this report and search on that keyword (or combinations thereof).   If, in the hypothetical case I’ve already outlined, you have a page doing well and for some reason the majority of keywords working for that page are unknown to you, then you can come to this page and search on both sets of keywords and see which is performing better from the google.com side of things.&lt;/p&gt;  &lt;p&gt;You can also do a search through the CTR rates and impressions to find which keywords you could improve and optimise for.   Combined with the Google Keyword tool, you should be able to ascertain the broad trends well enough, despite the fact that it takes a little more work.&lt;/p&gt;  &lt;h2&gt;Conclusions&lt;/h2&gt;  &lt;p&gt;There is an old saying that goes like ‘when the rules change, the future changes’.  The rules for keyword data have just changed, and so the future has now changed.  You should probably be like me, get your toddler tantrum rant out of the way and then get on with figuring out how the future is going to work.  This is all very new, so it’s definitely important to monitor this space for changes, and additions.  It’s possible that Google might recant and start providing the data again, particularly if it affects their ad-buying business.  Or it’s possible that Google+ takes off and challenge Facebook and a majority of users will be logged on by default.  It’s possible that Android devices will stop referring search data or some other type scenario.&lt;/p&gt;  &lt;p&gt;The important takeaway is to start thinking about these scenarios now and work out your strategy to find the good keywords for your site, and how to optimise for them.  That part is unlikely to change at all.&lt;/p&gt;  &lt;p&gt;What do you think about it?  What percent of your traffic is now (not provided)?  Please let me know via the comments below.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it</guid>
      <pubDate>Thu, 01 Dec 2011 03:01:20 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=138</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke World 2011 Wrap up</title>
      <link>http://www.ifinity.com.au/2011/11/22/DotNetNuke_World_2011_Wrap_up</link>
      <description>&lt;p&gt;Well, it’s a week since I returned from the whirlwind that was DotNetNuke World.  Already things are starting to slip back into normality from the head-spinning fury of activity that was the conference.&lt;/p&gt;  &lt;p&gt;All I can say is that if you didn’t go, start pencilling in the date and the budget to go next year.&lt;/p&gt;  &lt;p&gt;This was the first year that DotNetNuke had it’s own, stand-alone conference, one that wasn’t co-located with the bigger DevConnections conference.  It was also a change in location, from Las Vegas to Orlando.  These two changes made a very big difference to the feel of the conference.&lt;/p&gt;  &lt;p&gt;Because it was only DotNetNuke people, it immediately felt more inclusive, more friendly and more focussed.  Because it was no longer in the cavernous halls of the DevConnections conference with what seems like a mile of walking to and from the hotel, it immediately felt more accessible.  And because there was *blink blink* outside areas to break out into, it gave everyone a chance to enjoy some warm Florida sunshine (not that I have any shortage of that where I come from, but those Northern types seemed to enjoy it).&lt;/p&gt;  &lt;p&gt;Here was an event where everyone you saw with a white lanyard on was a great person to have a chat to. &lt;/p&gt;  &lt;h2&gt;Conference Highlights &lt;/h2&gt;  &lt;p&gt;The Keynote speeches from Shaun Walker and Navin Nagiah were top quality.  Shaun covered off the achievements of DotNetNuke in the past 12 months, and the roadmap of features going forwards.  This included showcasing the impressive new Mobile features released in DNN 6.1, and answering some of those burning questions, like when were the social features going to be included. Shaun also recapped some of the impressive awards gained by DNN in 2011, including making the &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/EntryId/3210/DotNetNuke-makes-the-Gartner-Magic-Quadrant.aspx"&gt;Gartner Magic Quadrant&lt;/a&gt; and placing in the &lt;a href="http://www.dotnetnuke.com/News/Press-Releases/DotNetNuke-Corp.-Named-to-Inc.-500.aspx"&gt;Inc. 500 list of the fastest growing companies&lt;/a&gt;.  It’s easy to forget how fast all this has happened, because just 3 years ago DotNetNuke was a tiny company formed around the ownership of the DotNetNuke open source project.  Now it’s growing fast and the conference is evidence for all to see.  One statistics : all time DotNetNuke downloads are now at 7 million, and there are 700,000 live websites running DotNetNuke in the world.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Shaun Walker holding his bobble-head replica" border="0" alt="Shaun Walker and Bobble head" align="right" src="/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/IMG_0540.jpg" width="183" height="244" /&gt;Of course, the big laugh of the day was reserved for the revealing of the Shaun Walker Bobblehead doll.  Mitch Bishop, the new Chief Marketing Officer at DotNetNuke, revealed that they had made a limited-edition run of 50 ‘bobblehead’ dolls of Shaun.  Mitch presented one of these to a clearly flummoxed Shaun, and then told the crowd that any great questions, presentations, antics throughout the conference would result in the presentation of a bobblehead.   From then, it was up to people to come up with interesting ways of what to do with their bobbleheads – in the bounds of good taste, of course!  This even included stripping down and &lt;a href="http://www.youtube.com/watch?v=vxLOAh1AoT4&amp;feature=related" target="_blank"&gt;jumping in the pool to retrieve a bobble head&lt;/a&gt;, which Malik of Pointclick Technologies did, much to everyone's amusement.&lt;/p&gt;  &lt;p&gt;Navin’s keynote was a more sober affair, and clearly laid out the philosophy and strategy behind DotNetNuke and exhorted us in the crowd to do better, to work harder, because the competition out there in the Website platform business is fierce.   There is still a massive market for people to be running a complete website solution like DotNetNuke but it’s likely to be a winner takes all result, and with 1200 different options available, DotNetNuke needs to concentrate on being in the top 3.&lt;/p&gt;  &lt;p&gt;The ‘DNN After Dark’ function was a huge improvement over previous events I had attended and everyone there clearly had a good time.  If you were there, you’ll know about the infamous Nerf dart war that broke out using promotional toys from Arrow Consulting.  If that sounds like a bunch of computer nerds gone wild, well, it would be hard to disabuse that notion.  But more realistically it just shows that everyone was having a great time and it was a very fun event.  The fact that the room was full shows how keen attendees are to engage in both the learning and the social segments of the conference.&lt;/p&gt;  &lt;h2&gt;Presentations&lt;/h2&gt;  &lt;p&gt;Sadly with three of my own presentations to deliver, and lots of interesting conversations to be had in the hallways and breakout areas, I didn’t get to attend many sessions, and only grabbed parts of different presentations throughout the two full days of presenting.  But a lot of people told me there was some great sessions delivered.  Every session I peeked into was well attended and well regarded.&lt;/p&gt;  &lt;p&gt;For my sessions, I did three topics.  As a few people remarked – I must have done something to annoy the organisers to get that many sessions.  But in reality I had a lot of fun presenting and it was great to cover three entirely different topics:&lt;/p&gt;  &lt;h3&gt;DotNetNuke on Azure Cloud Servers&lt;/h3&gt;  &lt;p&gt;This presentation was both a discussion on how to create a DotNetNuke installation using the &lt;a href="http://dnnazureaccelerator.codeplex.com/"&gt;DotNetNuke Azure Accelerator&lt;/a&gt;, and also a discussion on how to strategically use Azure with DNN, both as a hosting service, but also for hosting content or using the CDN.&lt;/p&gt;  &lt;p&gt;If you missed this presentation, you can read more about it &lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/11/22/Installing_DotNetNuke_on_Microsoft_Azure_Cloud_Servers" target="_blank"&gt;here&lt;/a&gt;, and don’t miss the link provided by Microsoft to &lt;a href="http://www.microsoft.com/windowsazure/free-trial/"&gt;get a free 90 day trial for Azure&lt;/a&gt;.  Everyone should grab a copy of the Azure Accelerator, sign up for a free Azure trial, and see how easy it is to create a DNN website on Azure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/11/22/Installing_DotNetNuke_on_Microsoft_Azure_Cloud_Servers" target="_blank"&gt;See separate blog post on this session including the slides&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/DSC_0292.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="DSC_0292" border="0" alt="DSC_0292" src="/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/DSC_0292_thumb.jpg" width="644" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Your humble blogger presenting the session on DotNetNuke and Azure.  Photo courtesy David Rodriguez.&lt;/p&gt;  &lt;h3&gt;Tracking Social Media Campaigns for Effectiveness&lt;/h3&gt;  &lt;p&gt;In this session, I covered off many of the tools available for tracking your Social media activity.  I then presented the concept of gathering all these different metrics into a central location, and creating your own trend lines.  The idea with this is to gather the metrics on a periodic basis, then map your own trends based on the things that are most important to your campaign.  Part of this is identifying the goals of the campaign (followers, downloads, sales?)   Once this is in place, you can monitor which parts of your social media campaign are the most effective (in meeting your goals) and use simple analysis to double-down on the things that work, and abandon or at least cut back on the things that aren’t.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/2011/11/22/Tracking_your_Social_Media_Campaigns_for_Effectiveness_using_free_tools" target="_blank"&gt;See separate blog post on this session including the slides.&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Selling code in the DotNetNuke Store : from idea to execution&lt;/h3&gt;  &lt;p&gt;I had submitted this concept to the organisers of DotNetNuke conferences for 3 years in a row, so I was delighted when it was selected as a topic.  My only regret was the short 50 minute timeline with which to try and cram in all the things I have to say on this topic.  What the audience received was a high-speed download of my thoughts on the world of software development, how to become a successful vendor, and a presentation on how the upcoming changes to Snowcovered (soon to be re-branded the DotNetNuke store) are about to make the DotNetNuke eco-system a great place to be if you have the ability to write good code and indulge in a bit of shameless marketing.  This session was a lot of fun and it’s just a shame I didn’t get the chance to connect with more people who have questions on becoming part of this exciting little corner of the software industry.  Perhaps I might start a new blog series or something similar on this very topic because I sense there is great interest in it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/2011/11/22/Selling_your_code_in_the_DotNetNuke_store" target="_blank"&gt;See separate blog post on this session including the slides&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="6366318103_c25e76f2a5_b" border="0" alt="6366318103_c25e76f2a5_b" src="/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/6366318103_c25e76f2a5_b.jpg" width="644" height="431" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;Putting the last touches on one of my presentations while &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/BlogId/18.aspx" target="_blank"&gt;Scott Willhite&lt;/a&gt;  questions my choice of hardware in the DotNetNuke Community breakout area. &lt;/p&gt;  &lt;p align="center"&gt;Photo courtesy Will Strohl&lt;/p&gt;  &lt;h2&gt;Networking&lt;/h2&gt;  &lt;p&gt;All I can say about the networking at the DotNetNuke World conference is that it can’t be beaten.   This is the third year in a row that I have attended a DotNetNuke conference and I still run into people I haven’t met, some of whom are new to using DotNetNuke, some of whom are old hands.  And each year I enjoy renewing the friendships with people I have already met.    If all the conferences you’ve ever been to are full of people politely sipping coffee and making small talk until they can escape back to their rooms, you’ve got to attend a future DotNetNuke conference to witness the high energy exchanges of ideas and information, the meetings and more.  From the early morning breakfast discussions to the late-night free and frank exchanges of ideas in the hotel bar, the fun just never stops.&lt;/p&gt;  &lt;p&gt;However, apart from the fun aspect of meeting people and finding out what they are working on, the networking at DNN World made me realise that the DotNetNuke platform is rapidly growing up.  Where once my main conversations where with smaller system integrators, hosting firms and the like, increasingly my conversations where with government departments, representatives from larger companies, and people working on big projects.  This is an important change, because it shows that developers like myself need to step up again to a higher level of quality and support, and to recognise that the combination of people ‘out there’ is changing quickly in the mix.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="6332138879_01b20269a6_b" border="0" alt="6332138879_01b20269a6_b" src="/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/6332138879_01b20269a6_b.jpg" width="644" height="431" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;Deep in conversation at the lunch table during DotNetNuke World.  Photo courtesy Will Strohl&lt;/p&gt;  &lt;h2 align="left"&gt;Conclusions and Wrap up&lt;/h2&gt;  &lt;p align="left"&gt;It’s incredibly important for people like myself who are geographically isolated from many others who work on the same things to attend conferences like DotNetNuke World.  It’s why I spend the time and the money to attend, even though doing so means spending well over 24 hours in transit to get from my home to the conference.  The rewards certainly outweigh the costs, even though when it comes to booking it’s easy to feel that this won’t be the case.  &lt;/p&gt;  &lt;p align="left"&gt;With DotNetNuke World 2011 in Orlando, the concept of the DotNetNuke conference really came of age.  It developed a confidence in itself as a conference, and a confidence of DotNetNuke as a platform not only for writing software and building websites, but also for building businesses and relationships that will probably endure for a long time.  In the same way the conference no longer felt like a bolt-on to a .NET conference, the platform no longer feels like a bolt-on to the .NET framework but an entity unto itself that even Microsoft is taking notice of and supporting.&lt;/p&gt;  &lt;p align="left"&gt;Mitch Bishop asked us all to tell 5 people about the conference so that it can double in size next year.   I’m using my blog to do my part  - I hope I’ve got those who attended smiling in memory, and those who didn’t pencilling attendance for 2012 into their personal plan for next year. The dates will be announced much earlier this time, so there will be no reason not to go.   Will I see you there?&lt;/p&gt;  &lt;p align="left"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="IMG_0546" border="0" alt="IMG_0546" src="/Portals/0/images/DotNetNuke-World-2011-Wrap-up_7E29/IMG_0546.jpg" width="644" height="482" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;My Shaun Walker Bobblehead learns a thing or two between sessions&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Want to see more?  Visit the &lt;/em&gt;&lt;a href="http://www.flickr.com/search/?q=dnnworld" target="_blank"&gt;&lt;em&gt;Flickr DotNetNuke World photoset&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.   Please remember to abide by the licensing attached to individual photos.&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/11/22/DotNetNuke_World_2011_Wrap_up&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/11/22/DotNetNuke_World_2011_Wrap_up#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/11/22/DotNetNuke_World_2011_Wrap_up</guid>
      <pubDate>Tue, 22 Nov 2011 03:42:16 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=137</trackback:ping>
    </item>
    <item>
      <title>Selling your code in the DotNetNuke store</title>
      <link>http://www.ifinity.com.au/2011/11/22/Selling_your_code_in_the_DotNetNuke_store</link>
      <description>This blog post is a summary of my presentation at the DotNetNuke World 2011 conference held in Orlando, Florida.  &lt;br /&gt;  &lt;br /&gt;This presentation was one that I have wanted to do for years, and my only issue was that I only had 50 minutes to present the life-cycle of a developer who has a great idea to receiving money for their sales. The session covered ideas, marketing, support, pricing, licensing, the new DotNetNuke store and much more.  &lt;br /&gt;  </description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/11/22/Selling_your_code_in_the_DotNetNuke_store#Comments</comments>
      <slash:comments>6</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/11/22/Selling_your_code_in_the_DotNetNuke_store</guid>
      <pubDate>Tue, 22 Nov 2011 03:35:00 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=136</trackback:ping>
    </item>
    <item>
      <title>Tracking your Social Media Campaigns for Effectiveness using free tools</title>
      <link>http://www.ifinity.com.au/2011/11/22/Tracking_your_Social_Media_Campaigns_for_Effectiveness_using_free_tools</link>
      <description>This blog post is a summary of the presentation I did at the DotNetNuke World 2011 conference.  &lt;br /&gt;  &lt;br /&gt;The topic was tracking social media campaigns for effectiveness – and the synopsis of the talk I gave was on how to use different metrics available from free tools, and how to combine those together in your own way to aggregate the data. Once that was done, using trends to identify which of your social media actions are effective in achieving your goals, and then double-down on the things that are working well  </description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/11/22/Tracking_your_Social_Media_Campaigns_for_Effectiveness_using_free_tools#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/11/22/Tracking_your_Social_Media_Campaigns_for_Effectiveness_using_free_tools</guid>
      <pubDate>Tue, 22 Nov 2011 03:20:00 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=135</trackback:ping>
    </item>
    <item>
      <title>Installing DotNetNuke on Microsoft Azure Cloud Servers</title>
      <link>http://www.ifinity.com.au/2011/11/22/Installing_DotNetNuke_on_Microsoft_Azure_Cloud_Servers</link>
      <description>&lt;p&gt;This post is a summary of the presentation I did at the DotNetNuke World 2011 conference in Orlando, Florida.&lt;/p&gt;  &lt;p&gt;The sessions was centred around showing how to use the &lt;a href="http://dnnazureaccelerator.codeplex.com/" target="_blank"&gt;DotNetNuke Azure Accelerator&lt;/a&gt; which can be downloaded from Codeplex.&lt;/p&gt;  </description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/11/22/Installing_DotNetNuke_on_Microsoft_Azure_Cloud_Servers#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/11/22/Installing_DotNetNuke_on_Microsoft_Azure_Cloud_Servers</guid>
      <pubDate>Tue, 22 Nov 2011 03:07:00 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=134</trackback:ping>
    </item>
    <item>
      <title>Google adds Snippets for Bulleted Lists Search Engine Result</title>
      <link>http://www.ifinity.com.au/2011/11/01/Google_adds_Snippets_for_Bulleted_Lists_Search_Engine_Result</link>
      <description>&lt;p&gt;While doing some poking around on Google today I noticed an interesting change in the SERP result for this site.  &lt;/p&gt;  &lt;p&gt;I tag all of the Blog posts with my own &lt;a href="http://www.ifinity.com.au/Products/Tagger_Tag_Cloud_For_DNN"&gt;Tagger module&lt;/a&gt; which lists the tagged results out on a tag list page.  This is reached under a Url like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Explore_Tags/Tag/Redirect"&gt;http://www.ifinity.com.auhttp://www.ifinity.com.au/Explore_Tags/Tag/Redirect&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The above Url lists out all the items on the site that have been tagged with ‘Redirect’.&lt;/p&gt;  &lt;p&gt;Incidentally, the Tagger module was &lt;a href="http://www.ifinity.com.au/Products/Support_Forums/forumid/2/postid/7271/scope/posts#7271"&gt;recently upgraded to a new version&lt;/a&gt;, which included popup tag editing and now can merge the tag results with the Core tagging modules.  This means you can use it as a tag cloud for core tags, or use it to add the custom tags as originally designed, or a blend of both.&lt;/p&gt;  &lt;p&gt;Anyway, on this site it mostly is used to tag the blog entries, and then list them back out again when navigated from the tag cloud.&lt;/p&gt;  &lt;p&gt;So far so good – nothing unexpected.&lt;/p&gt;  &lt;p&gt;But it looks like Google has added yet another SERP listing type, which looks like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="tag-serp-detail" border="0" alt="tag-serp-detail" src="/Portals/0/images/Google-Adds_8FEB/tag-serp-detail.jpg" width="496" height="112" /&gt;&lt;/p&gt;  &lt;p&gt;The ‘meta’ description for the page is nowhere to be seen, and a random sample of text has not replaced it.  Instead we get a structured list of content taken from within the body of the Html itself.&lt;/p&gt;  &lt;p&gt;Notice how this provides a couple of things:&lt;/p&gt;  &lt;p&gt;- jump locations to popular content locations (Register, Login,Home)&lt;/p&gt;  &lt;p&gt;- unordered list of the top results, using the link text (blog title) as the summary&lt;/p&gt;  &lt;p&gt;- the list contains the most relevant links, and aren’t the same order/priority as the result in the actual page&lt;/p&gt;  &lt;p&gt;- highlights within the list where the keyword search matched&lt;/p&gt;  &lt;p&gt;- an estimate of how many items are listed on the page (ie, 10+ items).&lt;/p&gt;  &lt;p&gt;This appears in the overall page like this (showing the preview):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/Google-Adds_8FEB/tag-serp-large.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="tag-serp-large" border="0" alt="tag-serp-large" src="/Portals/0/images/Google-Adds_8FEB/tag-serp-large_thumb.jpg" width="644" height="414" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This new feature has been named ‘SEP Bullet Lists’ and ‘Rich Snippet for Listings’&lt;/p&gt;    &lt;p&gt;Possible advantages of these lists is it gives visitors a deep-dive into content.  We all know the benefit of bulleted lists when trying to present complex topics in a way to time-poor observers or readers.   The majority of Powerpoint slides ever made used bulleted lists, and they are everywhere.&lt;/p&gt;  &lt;p&gt;This could particularly advantage e-commerce sites if they can get actual product listings into bulleted lists, because it will give visitors a very good idea of what types of products they might find within the site.&lt;/p&gt;  &lt;h2&gt;How do I get those on my site?&lt;/h2&gt;  &lt;p&gt;Well, like so many things in Google-land, you don’t get a (direct) choice whether or not you get upgraded listings.  It’s something that the big brain of Google decides for itself when you’re worthy.&lt;/p&gt;  &lt;p&gt;The obvious question might be whether you need to use a &lt;ul&gt; list on your page in order to get it listed like this.  And the answer is a definitive ‘no’, because the Tag list page shown here isn’t built with &lt;ul&gt; at all, it’s simply a list of &lt;div&gt; blocks on the page.&lt;/p&gt;  &lt;p&gt;Here’s the official word from the ‘Inside Search’ blog : &lt;a href="http://insidesearch.blogspot.com/2011/08/new-snippets-for-list-pages.html"&gt;New snippets for list pages&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;If a search result consists mostly of a structured list, like a table or series of bullets, we’ll show a list of three relevant rows or items underneath the result in a bulleted format. The snippet will also show an approximate count of the total number of rows or items on the page (for example, “30+ items” in the screenshot below). &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This feature rolled out during September 2011.&lt;/p&gt;  &lt;p&gt;So the key is:&lt;/p&gt;  &lt;p&gt;- structured list for the html that contains your content – think a &lt;ul&gt;, &lt;ol&gt;, &lt;table&gt; or list of &lt;div&gt; elements.  &lt;/p&gt;  &lt;p&gt;- relevant results in that list and relevance for the entire page&lt;/p&gt;  &lt;p&gt;If you’re building a content module or perhaps authoring your Html manually, you may want to consider these points.  As has always been the case, clean, well structured Html is a factor in getting good search results.&lt;/p&gt;  &lt;p&gt;Now would be a good time to check if you’ve already had your results changed, and to think about how you might be able to leverage this change to get a better click-through rate when your site does feature in the results page.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/11/01/Google_adds_Snippets_for_Bulleted_Lists_Search_Engine_Result&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/11/01/Google_adds_Snippets_for_Bulleted_Lists_Search_Engine_Result#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/11/01/Google_adds_Snippets_for_Bulleted_Lists_Search_Engine_Result</guid>
      <pubDate>Tue, 01 Nov 2011 01:06:41 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=133</trackback:ping>
    </item>
    <item>
      <title>Maintaining your Google Analytics Tracking through redirects</title>
      <link>http://www.ifinity.com.au/2011/10/28/Maintaining_your_Google_Analytics_Tracking_through_redirects</link>
      <description>&lt;p&gt;A very useful feature of Google Analytics is the ability to track different urls for the same thing by including items such as campaign, source, medium, keyword and ad version.  This allows you to host links in different locations and then determine which is the most successful location, ad version, or combination.&lt;/p&gt;  &lt;p&gt;This gives you extra information in your Analytics page, like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/67f0c2b905d2_DAC5/analytics-campaigns.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="analytics-campaigns" border="0" alt="analytics-campaigns" src="/Portals/0/images/67f0c2b905d2_DAC5/analytics-campaigns_thumb.jpg" width="244" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above : Detailed Medium + Campaign information shown in Google Analytics from Url tracking codes&lt;/p&gt;  &lt;p&gt;However, sometimes during the process of redirecting, this detail gets lost, and as a result Google Analytics loses the information, and can’t provide accurate reports.  This also affects the use of AdWords.&lt;/p&gt;  &lt;p&gt;With the Url Master module, the redirection sometimes occurs because another part of the Url triggers a redirect action.  This could be because it has the wrong domain name, the wrong case, or maybe it has a TabId parameter included in it.&lt;/p&gt;  &lt;p&gt;Because of the way the module works, it attempts to discern which parts of a raw Url is part of a querystring, and which part is part of a friendly Url path.  In DotNetNuke, a raw Url looks something like &lt;a href="http://example.com/default.aspx?tabid=165&amp;key=value"&gt;http://example.com/default.aspx?tabid=165&amp;key=value&lt;/a&gt;.  If this were redirected using the Url Master module, you’d end up with &lt;a href="http://example.com/page-name/key/value.aspx"&gt;http://example.com/page-name/key/value.aspx&lt;/a&gt; – which is most likely correct.&lt;/p&gt;  &lt;p&gt;However, if you include analytics tracking information in the Url, then the Url Master module tends to not know where the tracking codes start and the rest of the path ends.  And so you might end up with a Url that looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/page-name/key/value/utm_source/test+source/utm_keyword/test+keyword/utm_campaign/test+campaign.aspx"&gt;http://example.com/page-name/key/value/utm_source/test+source/utm_keyword/test+keyword/utm_campaign/test+campaign.aspx&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Which isn’t correct, because the analytics code looks specifically at the querystring of the Url for the tracking information, and it’s been moved into the main path of the Url.&lt;/p&gt;  &lt;p&gt;What the above Url should look like is this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/page-name/key/value.aspx?utm_source=test+source&amp;utm_keyword=test+keyword&amp;utm_campaign=test+campaign"&gt;http://example.com/page-name/key/value.aspx?utm_source=test+source&amp;utm_keyword=test+keyword&amp;utm_campaign=test+campaign&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you have the above problem, you’ll probably find out because expected analytics tracking isn’t working, and you’re getting discrepancies between your data.&lt;/p&gt;  &lt;p&gt;NOTE: The &lt;a href="http://www.google.com/support/analytics/bin/answer.py?answer=55578"&gt;Google Analytics Url Builder Tool&lt;/a&gt; is a good way to build these Urls quickly.&lt;/p&gt;  &lt;h2&gt;The Url Master ‘doNotIncludeInPathRegex’ Filter is the Solution&lt;/h2&gt;  &lt;p&gt;There is a regex field in the Url Master module which handles this situation.  What this regex pattern does is identify key/value pairs that shouldn’t be in the path, and moves them to the querystring.  So, in this case, all you need to do is identify the utm_ parts, and the inbuilt logic will shuffle them to a querystring value.&lt;/p&gt;  &lt;p&gt;The one caveat is that you have to identify all of the path – not just the ‘key’ – you need to capture the /key/value pair.&lt;/p&gt;  &lt;p&gt;For the above url with Google tracking codes, you could just write a matching pattern like this:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;(/utm_source/[^/]+)|(/utm_keyword/[^/]+)|(/utm_campaign/[^/]+)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This would match both the key - &lt;strong&gt;/utm_source&lt;/strong&gt; and the value &lt;strong&gt;/[^/']+&lt;/strong&gt; .  &lt;/p&gt;  &lt;p&gt;Small Regex tutorial – the [a] pattern matches any ‘a’ character.   So [/] matches any / in some text.  The ^ pattern is a NOT operator. So [^/'] matches anything that is NOT /.  And the + character following means ‘match 1 or more times’.  So &lt;strong&gt;[^/]+&lt;/strong&gt; means ‘match 1 or more characters you find that aren’t a ‘/’.  And that’s how you match any value that follows &lt;strong&gt;utm_source&lt;/strong&gt;.  See, regex isn’t that hard, is it?&lt;/p&gt;  &lt;p&gt;However, there is one small problem with the above pattern is that it (1) presumes the source/keyword/campaign values will always be in the correct order, and that there won’t be any other utm_ values.  In fact there are 5 possible utm_ keys – including term, medium, keyword and content.&lt;/p&gt;  &lt;p&gt;So what we need is a more generic function that will make sure NO Google Analytics tracking segments are matched and included in a Url path.  And that’s our solution regex:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;(/utm[^/]+/[^/]+)+&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Anyone who was paying attention in the first Regex tutorial will know that this says match anything starting with /utmxxxxx and the value following that, and match as many of those as you can find, as long as they are all grouped together.&lt;/p&gt;  &lt;p&gt;At this point, you need to go to your Host-&gt;Friendly Url Settings page, navigate to the Regex Settings tab, scroll down to the ‘doNotIncludeInPathRegex’ field, and copy and paste that value in.&lt;/p&gt;  &lt;p&gt;Apply the changes, and you should have fixed your problem!&lt;/p&gt;  &lt;p&gt;This information is also &lt;a href="http://www.ifinity.com.au/Products/KB/Url_Master/topic/Keeping+querystring+data+out+of+the+Url+Path"&gt;posted on the Url Master Knowledge Base&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;A Note about the DotNetNuke Blog Module&lt;/h2&gt;  &lt;p&gt;If you’re thinking about tracking your Blog entries from your DotNetNuke hosted blog, you’ll come into a little bit of trouble.&lt;/p&gt;  &lt;p&gt;The DotNetNuke Blog module has a feature where by it will enforce the ‘Permalink’ Url (which is just the canonical Url of a post) by comparing it to the requested Url for an entry, and if they are different, it will 301 redirect away from the requested Url to the stored Permalink Url.  Which is great, because it means that you won’t get any duplicate content problems caused by different blog posts being linked with different Urls.&lt;/p&gt;  &lt;p&gt;But the Blog authors didn’t foresee a world where everyone had utmsource=my+blog+campaign stuck on the back of the Urls, and it will detect a tracked blog entry as incorrect, and redirect away.  And because the tracking in Google Analytics is done by javascript once the page is loaded, you’ll lose the extra utm_ parameters on the querystring, and your tracking will not work.&lt;/p&gt;  &lt;p&gt;I’ve rolled my own solution on this blog, which just means cracking open the source code and adding a little change to compare the Urls &lt;em&gt;sans&lt;/em&gt; querystring.  I’ll monitor this for a while, and if it’s working OK will see if I can get it included in the next Blog release.  But if you’re trying to track your blog entries using Analytics with unique tracking codes, you’ll find that it isn’t working.&lt;/p&gt;  &lt;h2&gt;Sound Interesting?&lt;/h2&gt;  &lt;p&gt;I’m doing an entire &lt;a href="http://dotnetnukeworld.dotnetnuke.com/Speakers/bios/aid/8.aspx"&gt;session on Tracking Social Media Campaigns&lt;/a&gt; for Effectiveness at the upcoming DotNetNuke World conference.  Why not come along and learn more information like this?&lt;/p&gt;  &lt;h2&gt;Do you know of any more problems with tracking Urls in DotNetNuke via Analytics?&lt;/h2&gt;  &lt;p&gt;Let me know via the comments and I’ll ferret out an answer for you!&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/10/28/Maintaining_your_Google_Analytics_Tracking_through_redirects&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/10/28/Maintaining_your_Google_Analytics_Tracking_through_redirects#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/10/28/Maintaining_your_Google_Analytics_Tracking_through_redirects</guid>
      <pubDate>Fri, 28 Oct 2011 08:02:38 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=132</trackback:ping>
    </item>
  </channel>
</rss>
