Useful PowerShell scripts for a Sitecore developer

 


Below are some helpful PowerShell scripts that prove beneficial for any Sitecore developer when making bulk changes in Sitecore or generating self-signed certificates.

#1. Insert a user in Sitecore using the Sitecore PowerShell Extensions (SPE):

# Set the user credentials
$userName = "user1"
$password = "passw0rd123"
$email = "user1@example.com"
$role = "sitecore\ContentAuthor"  # Specify the desired role

# Get the user manager
$userManager = Get-UserManager

# Check if the user already exists
if ($userManager.GetUser($userName) -eq $null) {
    # Create a new user
    $newUser = $userManager.CreateUser($userName, $password, $email, $null)

    # Add the user to the specified role
    if ($newUser -ne $null) {
        $roleProvider = [Sitecore.SecurityModel.Roles.RoleManager]::GetRoleProvider("switcher")

        # Get the role
        $sitecoreRole = $roleProvider.GetRole($role)

        # Add the user to the role
        $sitecoreRole.AddMember($newUser)
        
        Write-Host "User '$userName' created and added to the '$role' role."
    } else {
        Write-Host "Failed to create the user."
    }
} else {
    Write-Host "User '$userName' already exists."
}
Note - Make sure to replace the placeholder values (user1, passw0rd123, user1@example.com, and sitecore\ContentAuthor) with the actual values you want to use.

#2. Create self-signed certificate for dev environment:

  • Open a PowerShell console and execute the following command. 
  • Replace “www.demo.dev.local” by your own site URL and “web-sc-dev” by a name of your choice.

New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "www.demo.dev.local" -FriendlyName "web-sc-dev" -NotAfter (Get-Date).AddYears(5)
  • This will create a self-signed certificate for your site that is valid for 5 years. 
  • Now you should copy this certificate to the Trusted Root Certification Authorities store.

#3. Script to enable item level Language fallback:


$sourcePath = "master:/sitecore/content/Home/Site1"
$items = Get-ChildItem -Path $sourcePath -Recurse
$rootItem = Get-Item -Path $sourcePath
$items = $items + $rootItem

foreach($item in $items){

    if ($item.Fields["__Enable Item Fallback"].Value -ne "1")
    {
        $item.Editing.BeginEdit();
        $item.Fields["__Enable Item Fallback"].Value = '1'
        $item.Editing.EndEdit();
        Write-Host $item.ID $item.Fields["__Enable Item Fallback"].Value $item.Paths.Path
    }
 
}

#4. Update Workflow state for an Item:

# Set the item path
$itemPath = "/sitecore/content/Home/YourItemPath"

# Set the target workflow state
$targetWorkflowState = "Approved"

# Get the item
$item = Get-Item -Path $itemPath

if ($item -ne $null) {
    # Set the workflow state for the item
    $item.Editing.BeginEdit()
    $item.Fields["__Workflow state"].Value = $targetWorkflowState
    $item.Editing.EndEdit()

    Write-Host "Workflow state updated to '$targetWorkflowState' for item '$itemPath'."
} else {
    Write-Host "Item not found at path '$itemPath'."
}

#5. Add / Remove Workflow:

# Set the item path
$itemPath = "/sitecore/content/Home/YourItemPath"

# Get the item
$item = Get-Item -Path $itemPath

# Set workflow ID to assign a Workfolw to the item
$workflowID = "{7CFB68EE-5E9A-4D36-9E4C-A47D667B87FB}"

if ($item -ne $null) {
   
    $item.Editing.BeginEdit()
    
    # Remove the workflow from the item
    $item.Fields["__Workflow"].Reset()
    
    # Assign the workflow to the item
     $item.Fields["__Workflow"] = $workflowID
    
    $item.Editing.EndEdit()

    Write-Host "Workflow added/removed from item '$itemPath'."
} else {
    Write-Host "Item not found at path '$itemPath'."
}

#6. Remove the renderings of items:

$sourcePath = "master:/sitecore/content/Home/Site1"
$items = Get-ChildItem -Path $sourcePath -Recurse

foreach($item in $items)
{
    if ($item.TemplateId -eq "{BAAF9E6D-000F-4C58-9BDF-E0E6F04EF5A9}")
    {
        $item.Editing.BeginEdit();
        $item.Fields["__Renderings"].Value = ""
        $item.Fields["__Final Renderings"] = ""
        $item.Editing.EndEdit();
        Write-Host "Renderings removed for: " $item.ID " 
    }
}

#7. Unlock all locked items:


 $sourcePath = "/sitecore/content/Site1/Home"
 $items = Get-ChildItem -Path $sourcePath -Recurse
 $rootItem = Get-Item -Path $sourcePath
 $items = $items + $rootItem

 foreach ($item in $items)
 {
  foreach ($version in $item.Versions.GetVersions($true))
  {
      if($version.Locking.IsLocked())
      {
        $version.Editing.BeginEdit();
        $version.Locking.Unlock();
        $version.Editing.EndEdit();
        Write-Host "Item un-locked:" $item.ID $version.Language;
      }
   }
 }

#8. Get item publishing date and path

$path = "master:/sitecore/content/My Content/Articles"
$templateName = "Article Page Template"

$items = Get-ChildItem –Path $path –Recurse | Where-Object { $_.TemplateName -eq $templateName }

foreach($item in $items) {
    
  $dateTime = ([sitecore.dateutil]::IsoDateToDateTime($item["Publish Date"]))

  Write-Host ($item.ItemPath + "| Publish Date: " + $dateTime.ToString("dd MMMM yyyy"))
}

#9. Get updated item details in last 5 days

$path ="master:/sitecore/content/Global Content/Articles"

$items = Get-ChildItem -Path $path -Recurse | Where-Object { $_.__Updated -gt [datetime]::Now.AddDays(-5) }

ForEach ($item in $items)
{
    Write-Host $item.ID $item.Paths.Path $item."__Updated By"
}

Write-Host "Total item updated : " $items.Count

#10. Publish an item:

# Set the item path
$itemPath = "/sitecore/content/Home/YourItemPath"

# Get the item
$item = Get-Item -Path $itemPath

if ($item -ne $null) {
    # Publish the item
    $publishOptions = New-Object Sitecore.Publishing.PublishOptions($item.Database, [System.DateTime]::Now, "full", [Sitecore.SecurityModel.Authentication.AuthenticationManager]::GetActiveUser())
    $publisher = New-Object Sitecore.Publishing.Publisher($publishOptions)

    $publisher.Options.RootItem = $item
    $publisher.Publish()
    
    Write-Host "Item '$itemPath' published successfully."
} else {
    Write-Host "Item not found at path '$itemPath'."
}

I trust that this blog will provide you with helpful and practical scripts. I also commit to consistently updating this blog with useful scripts in the future.

Thanks!

Comments

Popular posts from this blog

Setup Sitecore XM Cloud Dev Environment using Docker

Sitecore Content Hub - Triggers, Actions and Scripts

All Blog Posts - 2023