{"id":36,"date":"2007-06-18T18:06:00","date_gmt":"2007-06-18T23:06:00","guid":{"rendered":"http:\/\/www.dontpapanic.com\/blog\/?p=36"},"modified":"2011-04-19T08:38:23","modified_gmt":"2011-04-19T12:38:23","slug":"feature-to-install-a-custom-master-page","status":"publish","type":"post","link":"https:\/\/www.dontpapanic.com\/blog\/?p=36","title":{"rendered":"Feature to Install a Custom Master Page"},"content":{"rendered":"<div class=\"ExternalClass0D4A66C1173141FAA693A1E64AA30ECF\">\n<div>\n<p>A former student brought an excellent BLOG post that Heather Solomon made last October (<a href=\"http:\/\/www.heathersolomon.com\/blog\/articles\/servermstpageforsitecollect_feature.aspx\">http:\/\/www.heathersolomon.com\/blog\/articles\/servermstpageforsitecollect_feature.aspx<\/a>) to my attention recently.&#160; Heather demonstrated how to create a Feature that could be used to install a Custom Master Page for a Site Collection.&#160; There was however one limitation to the approach that Heather used, it could only be used on a Site where the Publishing Feature was enabled.&#160; My student wondered if there was a way to do something similar for regular WSS Team Sites.<\/p>\n<p>Normally, I teach students how to do this by planning ahead and creating or modifying Site Definitions BEFORE you create the Site Collection and Top Level Site.&#160;&#160;&#160; The <em>MasterUrl<\/em> and <em>CustomMasterUrl<\/em> attributes represent two replaceable parameters that can be used to set the Masterpage attribute of the <strong>@Page <\/strong>declaration on the pages of a SharePoint site.&#160; \u201cOut of the Box\u201c .aspx pages point to a Masterpage at <strong>~\/masterurl\/default.master<\/strong>. This will be replaced at runtime by the <em>MasterUrl <\/em>property of the Website.&#160; The default setting for this is <strong>_catalogs\/masterpage\/default.master<\/strong>.&#160; This is the <strong>default.master<\/strong> file in the Master Pages gallery of the website.&#160; Until you edit this file using SharePoint Designer it will point to a ghosted copy of the file in the TEMPLATE\\GLOBAL directory of the 12 hive.&#160; You can also ghost custom <em>.Master<\/em> files from your Site Definition directory into the Masterpage gallery of the site using a <em>Module<\/em> Element.&#160; Then you can set the <em>MasterUrl<\/em> and\/or <em>CustomMasterUrl<\/em> attributes of the <em>Configuration<\/em> Element in the <strong>ONET.xml<\/strong> file to point at these ghosted .Master files.&#160; If you also change the <strong>@Page <\/strong>directive of the .aspx files on your site to use <strong>~\/masterurl\/custom.master <\/strong>you will establish a hierarchy of master pages that will be used.&#160; The page will first try to use the <em>customMasterUrl <\/em>setting, then the <em>masterUrl<\/em> setting, and finally the <em>default.master<\/em> file in GLOBAL.<\/p>\n<p>Making these changes later will NOT result in a change to existing Sites, but you can also set the <em>MasterUrl<\/em> and <em>CustomMasterUrl<\/em> properties of a Website programmatically.&#160; So I reasoned it would be possible to create an Event Handler that would fire when a Feature was activated to set these properties and then move the <em>.Master<\/em> files using a Feature Module.&#160; Activating this Feature on a site would accomplish the same changes outlined above by a custom site definition.&#160; Here&#8217;s how it can be done.<\/p>\n<p>First, we need a <strong>Feature. <\/strong>To create our Feature we need a Subdirectory Called <strong>CustomMaster<\/strong> in the <strong>TEMPLATE\\FEATURES<\/strong> directory of the 12 hive.&#160; Then we need add 4 files to this directory:&#160; Feature.xml, Elements.xml, Custom.master, and myDefault.master.<\/p>\n<p><strong><u>FEATURE.XML<\/u> &#8211;<\/strong> This file is used to identify the feature and list out the items that will be part of the Feature.&#160; Our Feature will include an assembly that will contain code to run in response to Feature events and an Elements.xml file.&#160; The code for our Feature is listed below:<\/p>\n<p><font face=\"Courier New\"><\/font>        <\/p>\n<div class=\"csharpcode\">\n<pre><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">&lt;?<\/span><span class=\"html\">xml<\/span> <span class=\"attr\">version<\/span><span class=\"kwrd\">=&quot;1.0&quot;<\/span> <span class=\"attr\">encoding<\/span><span class=\"kwrd\">=&quot;utf-8&quot;<\/span> ?<span class=\"kwrd\">&gt;<\/span><\/pre>\n<pre><span class=\"lnum\">   2:  <\/span><span class=\"kwrd\">&lt;<\/span><span class=\"html\">Feature<\/span> <span class=\"attr\">xmlns<\/span><span class=\"kwrd\">=&quot;http:\/\/schemas.microsoft.com\/sharepoint\/&quot;<\/span><\/pre>\n<pre><span class=\"lnum\">   3:  <\/span>         <span class=\"attr\">Id<\/span><span class=\"kwrd\">=&quot;90969656-A1C9-4f40-A95F-A3BDDF5723BF&quot;<\/span><\/pre>\n<pre><span class=\"lnum\">   4:  <\/span>         <span class=\"attr\">Title<\/span><span class=\"kwrd\">=&quot;Use Custom Master File&quot;<\/span><\/pre>\n<pre><span class=\"lnum\">   5:  <\/span>         <span class=\"attr\">Scope<\/span><span class=\"kwrd\">=&quot;Web&quot;<\/span><\/pre>\n<pre><span class=\"lnum\">   6:  <\/span>         <span class=\"attr\">ReceiverAssembly<\/span><span class=\"kwrd\">=&quot;CustomMaster, Version=1.0.0.0,<\/pre>\n<pre><span class=\"lnum\">   7:  <\/span>             Culture=neutral, PublicKeyToken=bcee0f83b26fbb16&quot;<\/span><\/pre>\n<pre><span class=\"lnum\">   8:  <\/span>         <span class=\"attr\">ReceiverClass<\/span> <span class=\"kwrd\">=&quot;CustomMaster.ChangeMaster&quot;<\/span> <span class=\"kwrd\">&gt;<\/span><\/pre>\n<pre><span class=\"lnum\">   9:  <\/span>    <span class=\"kwrd\">&lt;<\/span><span class=\"html\">ElementManifests<\/span><span class=\"kwrd\">&gt;<\/span><\/pre>\n<pre><span class=\"lnum\">  10:  <\/span>        <span class=\"kwrd\">&lt;<\/span><span class=\"html\">ElementManifest<\/span> <span class=\"attr\">Location<\/span><span class=\"kwrd\">=&quot;Elements.xml&quot;<\/span><span class=\"kwrd\">\/&gt;<\/span><\/pre>\n<pre><span class=\"lnum\">  11:  <\/span>    <span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">ElementManifests<\/span><span class=\"kwrd\">&gt;<\/span><\/pre>\n<pre><span class=\"lnum\">  12:  <\/span><span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">Feature<\/span><span class=\"kwrd\">&gt;<\/span><\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p><font face=\"Lucida Sans Unicode\"><u><strong>ELEMENTS.XML<\/strong><\/u> &#8211; In this file we will identify two .Master files that will be ghosted to the masterpages gallery of the site.<\/font><\/p>\n<p><font face=\"Courier New\"><\/font><\/p>\n<div class=\"csharpcode\">\n<pre><font color=\"#444444\"><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">&lt;?<\/span><span class=\"html\">xml<\/span> <span class=\"attr\">version<\/span><span class=\"kwrd\">=&quot;1.0&quot;<\/span> <span class=\"attr\">encoding<\/span><span class=\"kwrd\">=&quot;utf-8&quot;<\/span> ?<span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   2:  <\/span><span class=\"kwrd\">&lt;<\/span><span class=\"html\">Elements<\/span> <span class=\"attr\">xmlns<\/span><span class=\"kwrd\">=&quot;http:\/\/schemas.microsoft.com\/sharepoint\/&quot;<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   3:  <\/span>    <span class=\"kwrd\">&lt;<\/span><span class=\"html\">Module<\/span> <span class=\"attr\">Name<\/span><span class=\"kwrd\">=&quot;AddMasters&quot;<\/span> <span class=\"attr\">Url<\/span><span class=\"kwrd\">=&quot;_catalogs\/MasterPage&quot;<\/span> <span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   4:  <\/span>        <span class=\"kwrd\">&lt;<\/span><span class=\"html\">File<\/span> <span class=\"attr\">Url<\/span><span class=\"kwrd\">=&quot;MyDefault.master&quot;<\/span> <span class=\"attr\">Type<\/span><span class=\"kwrd\">=&quot;GhostableInLibrary&quot;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   5:  <\/span>          <span class=\"attr\">IgnoreIfAlreadyExists<\/span><span class=\"kwrd\">=&quot;True&quot;<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   6:  <\/span>          <em><span class=\"kwrd\">&lt;<\/span><span class=\"html\">Property<\/span> <span class=\"attr\">Name<\/span>=\u201c<span class=\"attr\">ContentType<\/span>\u201d<\/em><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   7:  <\/span>             <em><span class=\"attr\">Value<\/span>=\u201c$<span class=\"attr\">Resources:cmscore<\/span>,<span class=\"attr\">contenttype_masterpage_name<\/span>;&quot;<\/em> <span class=\"kwrd\"><em>\/&gt;<\/em><\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   8:  <\/span>        <span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">File<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">   9:  <\/span>        <span class=\"kwrd\">&lt;<\/span><span class=\"html\">File<\/span> <span class=\"attr\">Url<\/span><span class=\"kwrd\">=&quot;custom.master&quot;<\/span> <span class=\"attr\">Type<\/span><span class=\"kwrd\">=&quot;GhostableInLibrary&quot;<\/span> <\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  10:  <\/span>          <span class=\"attr\">IgnoreIfAlreadyExists<\/span><span class=\"kwrd\">=&quot;True&quot;<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  11:  <\/span>         <em> <span class=\"kwrd\">&lt;<\/span><span class=\"html\">Property<\/span> <span class=\"attr\">Name<\/span>=\u201c<span class=\"attr\">ContentType<\/span>\u201d<\/em><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  12:  <\/span>             <em><span class=\"attr\">Value<\/span>=\u201c$<span class=\"attr\">Resources:cmscore<\/span>,<span class=\"attr\">contenttype_masterpage_name<\/span>;&quot; <span class=\"kwrd\">\/&gt;<\/span><\/em><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  13:  <\/span>        <span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">File<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  14:  <\/span>  <span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">Module<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<pre><font color=\"#444444\"><span class=\"lnum\">  15:  <\/span><span class=\"kwrd\">&lt;\/<\/span><span class=\"html\">Elements<\/span><span class=\"kwrd\">&gt;<\/span><\/font><\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/p>\n<p><font face=\"Lucida Sans Unicode\"><strong>MYDEFAULT.MASTER<\/strong> and <strong>CUSTOM.MASTER<\/strong> &#8211; These are copies of the default.master file from the TEMPLATE\\GLOBAL directory of the 12 hive.&#160; If your .aspx page references the master file ~\/masterUrl\/default.master then myDefault.master will be used.&#160; If you reference ~\/masterUrl\/custom.master then Custom.Master will be used.&#160; WARNING: Do not use SharePoint Designer to edit files stored in the 12 hive.&#160; This would break the files. <\/font><\/p>\n<p><font face=\"Lucida Sans Unicode\">The last piece of the Feature is a Feature event handler that will be used to modify the <strong>masterUrl<\/strong> and <strong>customMasterUrl<\/strong> properties of the Website programmatically.&#160; The event handler will set the properties when the Feature is activated and reset them to the default when the Feature is deactivated.&#160; The code for the event handler is listed below:<\/font><\/p>\n<div class=\"csharpcode\">\n<pre><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">using<\/span> System;<\/pre>\n<pre><span class=\"lnum\">   2:  <\/span><span class=\"kwrd\">using<\/span> System.Collections.Generic;<\/pre>\n<pre><span class=\"lnum\">   3:  <\/span><span class=\"kwrd\">using<\/span> System.Text;<\/pre>\n<pre><span class=\"lnum\">   4:  <\/span><span class=\"kwrd\">using<\/span> Microsoft.SharePoint;<\/pre>\n<pre><span class=\"lnum\">   5:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">   6:  <\/span><span class=\"kwrd\">namespace<\/span> CustomMaster<\/pre>\n<pre><span class=\"lnum\">   7:  <\/span>{<\/pre>\n<pre><span class=\"lnum\">   8:  <\/span>    <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">class<\/span> ChangeMaster:Microsoft.SharePoint.SPFeatureReceiver <\/pre>\n<pre><span class=\"lnum\">   9:  <\/span>    {<\/pre>\n<pre><span class=\"lnum\">  10:  <\/span>        <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">override<\/span> <span class=\"kwrd\">void<\/span> FeatureInstalled<\/pre>\n<pre><span class=\"lnum\">  11:  <\/span>          (SPFeatureReceiverProperties properties)<\/pre>\n<pre><span class=\"lnum\">  12:  <\/span>        {<\/pre>\n<pre><span class=\"lnum\">  13:  <\/span>        }<\/pre>\n<pre><span class=\"lnum\">  14:  <\/span>        <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">override<\/span> <span class=\"kwrd\">void<\/span> FeatureUninstalling<\/pre>\n<pre><span class=\"lnum\">  15:  <\/span>           (SPFeatureReceiverProperties properties)<\/pre>\n<pre><span class=\"lnum\">  16:  <\/span>        {<\/pre>\n<pre><span class=\"lnum\">  17:  <\/span>        }<\/pre>\n<pre><span class=\"lnum\">  18:  <\/span>        <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">override<\/span> <span class=\"kwrd\">void<\/span> FeatureActivated<\/pre>\n<pre><span class=\"lnum\">  19:  <\/span>           (SPFeatureReceiverProperties properties)<\/pre>\n<pre><span class=\"lnum\">  20:  <\/span>        {<\/pre>\n<pre><span class=\"lnum\">  21:  <\/span>            SPWeb CurrentWeb = properties.Feature.Parent <span class=\"kwrd\">as<\/span> SPWeb;<\/pre>\n<pre><span class=\"lnum\">  22:  <\/span>            CurrentWeb.MasterUrl = <span class=\"str\">&quot;\/_catalogs\/masterpage\/MyDefault.master&quot;<\/span>;<\/pre>\n<pre><span class=\"lnum\">  23:  <\/span>            CurrentWeb.CustomMasterUrl = <span class=\"str\">&quot;\/_catalogs\/masterpage\/custom.master&quot;<\/span>;<\/pre>\n<pre><span class=\"lnum\">  24:  <\/span>            CurrentWeb.Update();<\/pre>\n<pre><span class=\"lnum\">  25:  <\/span>        }<\/pre>\n<pre><span class=\"lnum\">  26:  <\/span>        <span class=\"kwrd\">public<\/span> <span class=\"kwrd\">override<\/span> <span class=\"kwrd\">void<\/span> FeatureDeactivating<\/pre>\n<pre><span class=\"lnum\">  27:  <\/span>           (SPFeatureReceiverProperties properties)<\/pre>\n<pre><span class=\"lnum\">  28:  <\/span>        {<\/pre>\n<pre><span class=\"lnum\">  29:  <\/span>            SPWeb CurrentWeb = properties.Feature.Parent <span class=\"kwrd\">as<\/span> SPWeb;<\/pre>\n<pre><span class=\"lnum\">  30:  <\/span>            CurrentWeb.MasterUrl = <span class=\"str\">&quot;\/_catalogs\/masterpage\/default.master&quot;<\/span>;<\/pre>\n<pre><span class=\"lnum\">  31:  <\/span>            CurrentWeb.CustomMasterUrl = <span class=\"str\">&quot;\/_catalogs\/masterpage\/default.master&quot;<\/span>;<\/pre>\n<pre><span class=\"lnum\">  32:  <\/span>            CurrentWeb.Update();<\/pre>\n<pre><span class=\"lnum\">  33:  <\/span>       }<\/pre>\n<pre><span class=\"lnum\">  34:  <\/span>    }<\/pre>\n<pre><span class=\"lnum\">  35:  <\/span>}<\/pre>\n<pre><span class=\"lnum\">  36:  <\/span>&#160;<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p><font face=\"Lucida Sans Unicode\">Once the event handler has been compiled and added to the Global Assembly Cache and the Feature directory has been created you can Install and Activate the Feature.&#160; To install the Feature use the following command line:<\/font><\/p>\n<p><code><\/code><\/p>\n<pre class=\"csharpcode\">stsadm -o installfeature -n CustomMaster<\/pre>\n<p>\n           <\/p>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/p>\n<p><font face=\"Lucida Sans Unicode\">Then you can go to the Site Features link in SiteSettings on any SharePoint website and activate the Feature.&#160; Every website where the Feature is activated will use the myDefault.master stored in the Feature as its .master file.&#160; If you modify the @Page declaration of a page on the site to use <strong>~\/masterUrl\/Custom.master <\/strong>then the Custom.master will be used.<\/font><\/p>\n<p><\/font><\/p>\n<p><font color=\"#ff0000\">*** Updated July 3, 2008 ***<\/font><\/p>\n<p><font color=\"#ff0000\">I noticed recently that I left one line out of the Elements.xml file which prevented the feature from working in Site Collections where Publishing was turned on.&#160; In those sites the master pages gallery contains two content types so you have to specify what type of file you are &quot;ghosting&quot; with your .&#160; The Code that was added is italized in the code listing above.<\/font><\/p>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A former student brought an excellent BLOG post that Heather Solomon made last October (http:\/\/www.heathersolomon.com\/blog\/articles\/servermstpageforsitecollect_feature.aspx) to my attention recently.&#160; Heather demonstrated how to create a Feature that could be used to install a Custom Master Page for a Site Collection.&#160; There was however one limitation to the approach that Heather used, it could only be &hellip; <a href=\"https:\/\/www.dontpapanic.com\/blog\/?p=36\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Feature to Install a Custom Master Page<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[20,19,15],"class_list":["post-36","post","type-post","status-publish","format-standard","hentry","category-sharepoint-2007-dev","tag-branding","tag-development","tag-sharepoint_2007"],"_links":{"self":[{"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/36","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=36"}],"version-history":[{"count":2,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/36\/revisions"}],"predecessor-version":[{"id":141,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/36\/revisions\/141"}],"wp:attachment":[{"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dontpapanic.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}