I have seen a lot of content authors making a mistake of deleting an item in CMS before un-publishing it. This makes the item to persist in Target Database (usually the Web Database) as well as in search indexes.
To prevent this common mistake and to make the un-publishing easier, I created a Sitecore Powershell Module with confirmation.

Thanks to Sitecore Powershell Extensions, it took just couple of hours to implement this. Thanks to Sitecore Powershell Extensions
You can download Sitecore package to quickly install it in your Sitecore instance.
Let’s see in detail how it is created:
- Go to System/Modules/Powershell/Script Library and right click it.
Under insert options, click on Module Wizard.

- It opens SPE’s Module Wizard, provide a name for the module and choose the Integration points to create. As I wanted it to appear only in Content Editor Ribbon, I chose only this option.

- Once the module finishes running , it creates a complete list of Menus that are available in Core DB. Add Powershell script through insert options under the desired menu section or chunk and delete the others chunks which you do not require.

- After deleting unused chunks, configure icons for each buttons to make it user friendly.

- Next step is to update the PS Script for each button. To do this, open Powershell ISE and select button script .

- Update below scripts for respective buttons. The initial script of un-publishing was taken from here and improved to have SPE’s Interactive dialogs like Show-Confirm , which has Ok and Cancel button and Show-Alert , which displays alert message.
#UNPUBLISH AND DELETE BUTTON
#Getting selected Item
$sourceItem = Get-Item .
$displayMsg = "Are You Sure you want to Un-Publish and Delete '" + $sourceItem.Name + "' Item ?"
#Confirmation Dialog with Ok / Cancel Button
$ReturnValue = Show-Confirm -Title $displayMsg
function RunScript
{
#Making item unpublishable
$sourceItem.Editing.BeginEdit();
$sourceItem.Fields["__Never publish"].Value = "1";
$sourceItem.Editing.EndEdit();
#publishing item to web db in all languages - You can update desired target, language and publishing type below
Publish-Item $sourceItem -Target "web" -Language * -PublishMode Smart
#Removing the Item
$sourceItem | Remove-Item
}
#If Ok button is chosen it returns 'yes' which in turn runs the below script
if($ReturnValue -eq 'yes'){
$items = RunScript
$displayMsg = $sourceItem.Name + " Item has been Unpublished and Deleted !"
Show-Alert -Title $displayMsg
}
#UN-PUBLISH Child Items
#Getting selected Item
$sourceItem = Get-Item .
$displayMsg = "Are You Sure you want to Un-Publish Child Items of '" + $sourceItem.Name + "' Item ?"
#Confirmation Dialog with Ok / Cancel Button
$ReturnValue = Show-Confirm -Title $displayMsg
function RunScript
{
#Unpublishing and Removing Child Items
$items = Get-ChildItem -Path $sourceItem.ItemPath -Recurse
foreach ($item in $items)
{
$item.Editing.BeginEdit();
$item.Fields["__Never publish"].Value = "1";
$item.Editing.EndEdit();
Publish-Item $item -Target "web" -Language * -PublishMode SingleItem
}
}
#If Ok button is chosen it returns 'yes' which in turn runs the below script
if($ReturnValue -eq 'yes'){
$items = RunScript
$displayMsg = $sourceItem.Name + " Item's children have been unpublished successfully!!"
Show-Alert -Title $displayMsg
}
#UN-PUBLISH Selected Item
#Getting Selected Item
$sourceItem = Get-Item . -Language *
#Confirmation Dialog with Ok / Cancel Button
$displayMsg = "Are You Sure you want to Un-Publish " + $sourceItem[0].Name + " Item ?"
$ReturnValue = Show-Confirm -Title $displayMsg
function RunScript
{
foreach ($item in $sourceItem)
{
$item.Editing.BeginEdit();
$item.Fields["__Never publish"].Value = "1";
$item.Editing.EndEdit();
Publish-Item $item -Target "web" -PublishMode Smart
}
}
#If Ok button is chosen it returns 'yes' which in turn runs the below script
if($ReturnValue -eq 'yes'){
$items = RunScript
$displayMsg = $sourceItem[0].Name + " Item has been unpublished successfully!!"
Show-Alert -Title $displayMsg
}
- Click on Settings , select drop down next Rebuild All Integration Points and click on “Sync Library with Content Editor Ribbon“. This will sync the changes with Core DB.

- After Sync, goto Core DB and update Tool Tip as it cannot be done using Sync Library option.

- As a final step, assign security rights for each buttons. In my case, I wanted to provide “Unpublish Item and Delete” feature only for admin users whereas provide Unpublish for all content authors.


I hope it would make your un-publishing easier !! You can also download the package here.