Updating SP2013 refiners using PowerShell
In SharePoint 2010, changes to the refiners were made using the the FilterCategoriesDefinition property of the refiners web part which held an XML blob. In SharePoint 2013 we instead do this using the SelectedRefinementControlsJson property. As the name implies, the configuration is now in JSON format. Conveniently PowerShell 3.0 now includes the ConvertTo- and ConvertFrom-Json cmdlets that make this a breeze. Here’s a code snippet that changes the display name for the Last Modified Date refiner to “Mod Time” (all relevant error handling removed for clarity):
# Get our page and check it out
$spweb = Get-SPWeb "https://da-server/search/"
$page = $spweb.GetFile("Pages/results.aspx")
$page.CheckOut()
# Find the Refinement web part
$webPartManager = $spweb.GetLimitedWebPartManager("https://da-server/search/Pages/results.aspx", [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$rwp = $webpartmanager.webparts | ? { $_.title -eq 'Refinement' }
# Refiners are updated by changing the JSON
$j = $rwp.SelectedRefinementControlsJson | ConvertFrom-Json
$j.refinerConfigurations | % { if ($_.propertyName -eq 'LastModifiedTime') { $_.displayName = 'Mod Time'; }
$rwp.SelectedRefinementControlsJson = ConvertTo-Json $j -Compress
# Save our changes
$webpartmanager.SaveChanges($rwp) # save changes to webpart
$page.CheckIn('Changed last mod refiner')
$page.Publish('Changed last mod refiner')
Now, after reloading my search results page, I see the new display name:
Comments
Anonymous
January 01, 2003
Excellent stuff. Thanks for sharing.Anonymous
January 01, 2003
Nice post!
I'd like to add a new refiner to this web part.
How would you do it via PowerShell?Anonymous
January 01, 2003
The comment has been removedAnonymous
January 01, 2003
Hi All commands run successfully, I have done crawl again. but still can't see the difference.Anonymous
November 20, 2013
The comment has been removedAnonymous
February 06, 2014
Answered the question on stackexchange http://stackoverflow.com/questions/21410536/sharepoint-2013-selectedrefinementcontrolsjson-throwing-error/21604716#21604716Anonymous
November 12, 2014
Carolina Bauque: Were you able to achieve adding new refiner to a web part. if yes could you please share the codeAnonymous
January 08, 2015
Thanks for the great post!
In case it helps others, I was able to update the refiners using the following code:
$newRefinerConfigurations = @()
$newJsonObject = @{}
$jsonString = @"
{
"sortBy" : 0,
"sortOrder" : 0,
"maxNumberRefinementOptions" : 15,
"propertyName" : "",
"type" : "Text",
"displayTemplate" : "~sitecollection/_catalogs/masterpage/Display Templates/Filters/Filter_Default.js",
"displayName" : "",
"useDefaultDateIntervals" : false,
"aliases" : [],
"refinerSpecStringOverride" : "",
"intervals" : null
}
"@
$newRefinerJson = ConvertFrom-Json $jsonString
$newRefinerJson.propertyName = ""
$newRefinerJson.displayName = ""
$newRefinerConfigurations += $newRefinerJson
(add other refiners here..)
$newJsonObject.refinerConfigurations = $newRefinerConfigurations
$rwp.SelectedRefinementControlsJson = ConvertTo-Json $newJsonObject -Depth 3 -Compress
$webpartmanager.SaveChanges($rwp)Anonymous
May 11, 2015
Thanks very much