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

Medium Posts

All Blog Posts - 2024

Sitecore Content Hub - Triggers, Actions and Scripts