{"id":179,"date":"2010-05-28T22:36:12","date_gmt":"2010-05-28T20:36:12","guid":{"rendered":"http:\/\/jsiegmund.wordpress.com\/2010\/05\/28\/sp2010-programmatically-creating-a-web-part-page-with-connected-webparts\/"},"modified":"2013-04-18T18:41:43","modified_gmt":"2013-04-18T17:41:43","slug":"sp2010-programmatically-creating-a-web-part-page-with-connected-webparts","status":"publish","type":"post","link":"http:\/\/blog.repsaj.nl\/index.php\/2010\/05\/sp2010-programmatically-creating-a-web-part-page-with-connected-webparts\/","title":{"rendered":"SP2010: Programmatically creating a web part page with connected webparts"},"content":{"rendered":"<p>In my quest of creating dynamic sites in code, I stumbled upon a problem. What to do with the content of sites you&#8217;re creating dynamically? You can create lists fairly easy, creating things like views is a little more complicated but still doable. But when it comes to things like pages, things get a little bit more tricky. As long as your content is static, you can create a feature to deploy an aspx page to either ghosted or unghosted stored (in the database or in the filesystem). But if you want to show list data, for instance, or even more advanced: what about BCS data from a LOB system, based upon the site the page is located in? Well I&#8217;ve got it all figured out now, so I guessed that would be something to share! <!--more--><\/p>\n<p>First station: creating webpart pages dynamically. This is a\u00a0fairly easy thing to do. You need to copy one of the templates which are located in C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\1033\\STS\\DOCTEMP\\SMARTPGS. These are the same templates you can choose from when creating a webpart page from within SharePoint or SharePoint Designer. You can copy these and use them to create your own templates from; actually something we&#8217;ll need to do\u00a0later on.<\/p>\n<p>Here&#8217;s the code you need to create the page:<\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">FileStream<\/span> stream = <span style=\"color: blue;\">new<\/span><br \/>\n<span style=\"color: #2b91af;\">FileStream<\/span>(<span style=\"color: #2b91af;\">Path<\/span>.Combine(hive, templateFilename), <span style=\"color: #2b91af;\">FileMode<\/span>.Open);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">SPFolder<\/span> libraryFolder = web.GetFolder(foldername);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">SPFileCollection<\/span> files = libraryFolder.Files;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">SPFile<\/span> file = files.Add(pagename, stream);<br \/>\n<\/span><\/p>\n<p>One thing which might need explaining is the hive variable, not that hard but important:<\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: blue;\">static<\/span><br \/>\n<span style=\"color: blue;\">string<\/span> hive = <span style=\"color: #2b91af;\">SPUtility<\/span>.GetGenericSetupPath(<span style=\"color: #a31515;\">&#8220;TEMPLATE\\\\1033\\\\STS\\\\DOCTEMP\\\\SMARTPGS\\\\&#8221;<\/span>);<br \/>\n<\/span><\/p>\n<p>Ok, so this should set you up with a nice and clean webpartpage, based upon one of the templates. Now for adding the webparts to it.<\/p>\n<p>The easiest thing to do is to setup the webparts on an existing page in SharePoint (you could use the one you just created, but anyone will do). You can use SharePoint or SharePoint designer, that doesn&#8217;t make a difference. Once you&#8217;ve got the webpart setup the way you want it to (don&#8217;t bother to make connections, that&#8217;ll be useless), export it. This can be done in SharePoint designer by selecting the webpart, choosing the &#8220;Web Part&#8221; ribbon menu and clicking &#8220;To file&#8221;<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"http:\/\/blog.repsaj.nl\/wp-content\/uploads\/2010\/05\/052810_2036_sp2010progr1.png\" \/><\/p>\n<p>Now once you&#8217;ve saved your webpart file, you can add it to your new webpartpage with the following code:<\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">SPLimitedWebPartManager<\/span> wpmngr = file.Web.GetLimitedWebPartManager(file.ServerRelativeUrl, scope);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: blue;\">string<\/span> error = <span style=\"color: blue;\">string<\/span>.Empty;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">FileStream<\/span> file = <span style=\"color: blue;\">new<\/span><br \/>\n<span style=\"color: #2b91af;\">FileStream<\/span>(webpartFileLocation, <span style=\"color: #2b91af;\">FileMode<\/span>.Open);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">WebPart<\/span> webpart = wpmngr.ImportWebPart(<span style=\"color: #2b91af;\">XmlReader<\/span>.Create(file), <span style=\"color: blue;\">out<\/span> error);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.AddWebPart(webpart, zone, 0);<br \/>\n<\/span><\/p>\n<p>Couple of things to explain\u2026 You need to get the SPLimitedWebPartManager object to add the part to the page. You can feed the manager the XML from the webpart file which is loaded in a FileStream which is then fed into a XmlReader. The out parameter will contain any error messages, I&#8217;m not sure why that approach was chosen, I like exceptions more so you could just wrap the whole thing to throw an exception when something goes wrong:<\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: blue;\">try<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: #2b91af;\">FileStream<\/span> file = <span style=\"color: blue;\">new<\/span><br \/>\n<span style=\"color: #2b91af;\">FileStream<\/span>(webpartFileLocation, <span style=\"color: #2b91af;\">FileMode<\/span>.Open);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">WebPart<\/span> webpart = wpmngr.ImportWebPart(<span style=\"color: #2b91af;\">XmlReader<\/span>.Create(file), <span style=\"color: blue;\">out<\/span> error);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.AddWebPart(webpart, zone, 0);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">return<\/span> webpart;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: blue;\">catch<\/span> (<span style=\"color: #2b91af;\">Exception<\/span> ex)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">if<\/span> (!<span style=\"color: #2b91af;\">String<\/span>.IsNullOrEmpty(error))<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">throw<\/span><br \/>\n<span style=\"color: blue;\">new<\/span><br \/>\n<span style=\"color: #2b91af;\">Exception<\/span>(error);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">else<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">throw<\/span>;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p>If you now view your page, you webpart should be on there. A little tip: when you use a webpart which is styled with XSLT (like most BCS parts for instance), you can edit the XML of the webpart, strip the XSL code and use the XslLink property to link the webpart to an actual XSLT file. That way, if you deploy the page multiple times; all parts link to the same XSLT and updating the look-and-feel becomes real easy.<\/p>\n<p>Now for the last step: connecting the webparts. I&#8217;ll share the complete method which I use for this purpose:<\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;summary&gt;<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"> Connects two webparts to each other<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;\/summary&gt;<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;param name=&#8221;consumerWebPart&#8221;&gt;<span style=\"color: green;\">The webpart which will consume the data<span style=\"color: gray;\">&lt;\/param&gt;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;param name=&#8221;consumerInterfaceType&#8221;&gt;<span style=\"color: green;\">The type of interface the consumer endpoint should have<span style=\"color: gray;\">&lt;\/param&gt;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;param name=&#8221;providerWebPart&#8221;&gt;<span style=\"color: green;\">The webpart which will provide the data<span style=\"color: gray;\">&lt;\/param&gt;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: gray; font-family: Consolas; font-size: 9pt;\">\/\/\/<span style=\"color: green;\"><br \/>\n<span style=\"color: gray;\">&lt;param name=&#8221;providerInterfaceType&#8221;&gt;<span style=\"color: green;\">The type of interface the provider endpoint should have<span style=\"color: gray;\">&lt;\/param&gt;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: blue;\">public<\/span><br \/>\n<span style=\"color: blue;\">void<\/span> ConnectBusinessDataWebParts(<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">WebPart<\/span> consumerWebPart,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">string<\/span> consumerConnectionPoint,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">WebPart<\/span> providerWebPart,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">string<\/span> providerConnectionPoint,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: #2b91af;\">WebPartTransformer<\/span> transformer)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: green;\">\/\/ Get the connection point for the consumer.<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">ConsumerConnectionPointCollection<\/span> consumerConnections =<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.GetConsumerConnectionPoints(consumerWebPart);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: #2b91af;\">ConsumerConnectionPoint<\/span> consumerConnection = <span style=\"color: blue;\">null<\/span>;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">foreach<\/span> (<span style=\"color: #2b91af;\">ConsumerConnectionPoint<\/span> cpoint <span style=\"color: blue;\">in<\/span> consumerConnections)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">if<\/span> (cpoint.ID == consumerConnectionPoint)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">consumerConnection = cpoint;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">break<\/span>;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: green;\">\/\/ Get the connection point for the provider.<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">System.Web.UI.WebControls.WebParts.<span style=\"color: #2b91af;\">ProviderConnectionPointCollection<\/span> providerConnections =<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.GetProviderConnectionPoints(providerWebPart);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: #2b91af;\">ProviderConnectionPoint<\/span> providerConnection = <span style=\"color: blue;\">null<\/span>;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">foreach<\/span> (<span style=\"color: #2b91af;\">ProviderConnectionPoint<\/span> ppoint <span style=\"color: blue;\">in<\/span> providerConnections)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">if<\/span> (ppoint.ID == providerConnectionPoint)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">providerConnection = ppoint;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">break<\/span>;<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: green;\">\/\/ when a transformer was used; create a new connection based on it; otherwise without one<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">if<\/span> (transformer != <span style=\"color: blue;\">null<\/span>)<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">Microsoft.SharePoint.WebPartPages.<span style=\"color: #2b91af;\">SPWebPartConnection<\/span> newConnection =<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.SPConnectWebParts(<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">providerWebPart, providerConnection,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">consumerWebPart, consumerConnection, transformer);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.SPWebPartConnections.Add(newConnection);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><br \/>\n<span style=\"color: blue;\">else<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">{<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">Microsoft.SharePoint.WebPartPages.<span style=\"color: #2b91af;\">SPWebPartConnection<\/span> newConnection =<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.SPConnectWebParts(<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">providerWebPart, providerConnection,<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">consumerWebPart, consumerConnection);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">wpmngr.SPWebPartConnections.Add(newConnection);<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\">}<br \/>\n<\/span><\/p>\n<p>Ok, lets go through the parameters: both webparts are passed in since we want to connect them. A webpart can have multiple connection points, so we need to specify which point we want to use. I do that by string, which you need to find out just by debugging. The naming differs from webpart to webpart, so don&#8217;t guess: debug! The last parameter is an optional WebPartTransformer. When both endpoints of the webparts have a different interface type, a transformer is needed to convert the value of one to match the type of the other. There are a couple of transformers:<\/p>\n<h2><span style=\"color: #2b91af; font-family: Consolas; font-size: 9pt;\">TransformableFilterValuesToEntityInstanceTransformer<br \/>\n<\/span><\/h2>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">TransformableFilterValuesToFieldTransformer<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 9pt;\"><span style=\"color: #2b91af;\">TransformableFilterValuesToFilterValuesTransformer<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: #2b91af; font-family: Consolas; font-size: 9pt;\">TransformableFilterValuesToParametersTransformer<br \/>\n<\/span><\/p>\n<p>With some of them (<span style=\"color: #2b91af; font-family: Consolas; font-size: 9pt;\">TransformableFilterValuesToParametersTransformer<\/span> for instance) you need to specify the fieldnames of provider and\/or consumer. You&#8217;ll get an exception if you don&#8217;t <span style=\"text-decoration: underline;\">sometimes<\/span>, but other times it just doesn&#8217;t work without an error; so keep an eye open for that.<\/p>\n<p>Ok, you now have all the building blocks to create a new webpartpage, add webparts to it and connect them with each other.<\/p>\n<p>One last tip: depending on the settings of your library, you may need to either Publish or Check-in your page. Both actions can be done on your SPFile object.<\/p>\n<p>Enjoy!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my quest of creating dynamic sites in code, I stumbled upon a problem. What to do with the content of sites you&#8217;re creating dynamically? You can create lists fairly easy, creating things like views is a little more complicated but still doable. But when it comes to things like pages, things get a little<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[34],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p3KFR1-2T","_links":{"self":[{"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/posts\/179"}],"collection":[{"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/comments?post=179"}],"version-history":[{"count":0,"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/posts\/179\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/media?parent=179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/categories?post=179"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.repsaj.nl\/index.php\/wp-json\/wp\/v2\/tags?post=179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}