Skip to main content

How to Hide or Disable Publishing Targets in the Sitecore XP Publish Dialog

The Problem

We had a requirement in Sitecore where content authors should not be able to uncheck publishing targets in the Publish dialog. Sometimes, content authors accidentally uncheck the publishing target and then report that publishing is not working. We wanted to avoid this situation by ensuring that the publishing target always remains selected. One option we considered was to deny Read access to the publishing target using Sitecore security. However, our setup had only one publishing target. After denying Read access, the entire Publish button in the Experience Editor ribbon became disabled. This was not the expected behaviour. We wanted to restrict changes to the publishing target selection without affecting the publishing functionality. There are two possible approaches worth considering.

Option 1: Hide the Publishing Targets

The first approach is to keep all publishing targets selected and hide the target checklist from the dialog. The customization is in the following file:
/sitecore/shell/client/Applications/Publishing/PublishingShared.js
Locate the setDefaultCheckboxes logic and replace the existing target-locking behaviour with a helper like the following:
var selectAndHideTargets = function () {
    if (!this.CheckBoxListTargets) {
        return;
    }

    // Keep all targets selected
    if (typeof this.CheckBoxListTargets.checkAll === "function") {
        this.CheckBoxListTargets.checkAll();
    }

    // Hide the target checklist
    this.CheckBoxListTargets.IsVisible = false;

    // Fallback if IsVisible does not hide the rendering
    $(this.CheckBoxListTargets.el).hide();
}.bind(this);
Next, update the target-loading block so that the checklist is hidden after the target data has loaded:
this.GenericDataSourceTargets.loadData({
    onSuccess: function () {
        selectAndHideTargets();

        if (this.CheckBoxListTargets &&
            this.CheckBoxListTargets.off) {
            this.CheckBoxListTargets.off(
                "change:Items",
                selectAndHideTargets,
                this
            );
        }

        if (this.CheckBoxListTargets &&
            this.CheckBoxListTargets.on) {
            this.CheckBoxListTargets.on(
                "change:Items",
                selectAndHideTargets,
                this
            );
        }
    }.bind(this)
});
This approach selects all publishing targets and hides the checklist so that content authors cannot uncheck them through the dialog. Important: Sitecore Support provided this as sample code. It was not officially tested by the support team. Hiding a control is not the same as disabling it. Validate that the approach works as expected in your Sitecore version.

Option 2: Keep the Targets Visible but Disable the Checkboxes

Another possible approach is to keep the publishing targets visible but prevent authors from changing their selection. An AI-assisted response suggested modifying PublishingShared.js to select all targets and disable the checkbox inputs. Add the following helper immediately after the existing cookie preferences declaration:
var cookiePreferences = Preferences.LoadCookie();

var lockAllTargets = function() {
    if (!this.CheckBoxListTargets) return;

    if (typeof this.CheckBoxListTargets.checkAll === "function") {
        this.CheckBoxListTargets.checkAll();
    }

    var $root = $(this.CheckBoxListTargets.el);
    var $inputs = $root.find('input[type="checkbox"]');

    $inputs.each(function() {
        this.disabled = true;
        this.setAttribute('aria-disabled', 'true');
        this.setAttribute('tabindex', '-1');
    });

    $root.addClass('sc-disabled');
}.bind(this);
Then update the target-loading block:
this.GenericDataSourceTargets.loadData({
    onSuccess: function() {
        lockAllTargets();

        if (this.CheckBoxListTargets &&
            this.CheckBoxListTargets.off) {
            this.CheckBoxListTargets.off(
                "change:Items",
                lockAllTargets,
                this
            );
        }

        if (this.CheckBoxListTargets &&
            this.CheckBoxListTargets.on) {
            this.CheckBoxListTargets.on(
                "change:Items",
                lockAllTargets,
                this
            );
        }
    }.bind(this)
});
If the existing code calls this.CheckBoxListTargets.checkAll() separately in the same dialog flow, review that call as well and replace it with the new locking logic where appropriate. The intention is to keep the targets selected while making the checkboxes non-editable. However, this is an AI-suggested customization, not a verified Sitecore solution. Directly disabling HTML inputs may not cover every way the SPEAK component can update its selection. The sc-disabled class also does not, by itself, guarantee that the component is disabled. Test this approach carefully before using it in production. We raised this with Sitecore Support to understand whether this was the right way to achieve this and if there were any other recommended ways.

Sitecore Support Response

Sitecore Support registered a feature request for this requirement under reference number PDXP-33658. The request can be tracked for consideration in a future product release. The support team also shared a similar sample customization for hiding the publishing targets option in the Publish dialog.

Things to Consider Before Implementing

Before deploying either customization, I would recommend the following:
  1. Back up the original PublishingShared.js file.
  2. Test the publishing dialog from both Content Editor and Experience Editor.
  3. Confirm that all required publishing targets remain selected.
  4. Verify that the Publish button stays enabled and publishing completes successfully.
  5. Test whether the customization affects other publishing scenarios or dialogs.
  6. Document the customization because Sitecore upgrades may overwrite changes to client files.

Conclusion

The requirement is simple: content authors should be able to publish content without accidentally disabling the only publishing target. Sitecore Support registered this as feature request PDXP-33658 and shared a sample customization to hide the publishing target checklist. An alternative is to keep the checklist visible while disabling its checkboxes, but that approach needs additional validation. For either solution, test the behaviour in your specific Sitecore version before deploying it. A client-side customization should not inadvertently disable publishing or create a false impression that publishing targets are locked. Hope this helps!

Comments

POPULAR POSTS

Sitecore PowerShell Script to create all language versions for an item from en version

  We have lots of media items and our business wants to copy the data from en version of media item to all other language versions defined in System/Languages. This ensures that media is available in all the languages. So, we created the below powershell script to achieve the same -  #Get all language versions defined in System/Languages $languages = Get-ChildItem /sitecore/System/Languages -recurse | Select $_.name | Where-Object {$_.name -ne "en"} | Select Name #Ensuring correct items are updated by comparing the template ID  $items = Get-ChildItem -Path "/sitecore/media library/MyProjects" -Recurse | Where-Object {'<media item template id>' -contains $_.TemplateID} #Bulk update context to improve performance New-UsingBlock (New-Object Sitecore.Data.BulkUpdateContext) { foreach($item in $items){    foreach($language in $languages){ $languageVersion = Get-Item -Path $item.Paths.Path -Language $language.Name #Check if language versi...

Export Sitecore media library files to zip using SPE

If you ever require to export Sitecore media files to zip (may be to optimize them), SPE (Sitecore Powershell Extension) has probably the easiest way to do this for you. It's as easy as the below 3 steps -  1. Right click on your folder (icons folder in snap)>Click on Scripts> Click on Download 2. SPE will start zipping all the media files placed within this folder. 3. Once zipping is done, you will see the Download option in the next screen. Click Download Zip containing the media files within is available on your local machine. You can play around with the images now. Hope this helps!! Like and Share ;)

Make Sitecore instance faster using Roslyn Compiler

When we install the Sitecore instance on local, the first load is slow. After each code deploy also, it takes a while for the Sitecore instance to load and experience editor to come up. For us, the load time for Sitecore instance on local machines was around 4 minutes. We started looking for ways to minimize it and found that if we update our Web.config to use Roslyn compiler and include the relevant Nugets into the project, our load times will improve. We followed the simple steps - Go to the Project you wish to add the NuGet package and right click the project and click 'Manage NuGet Packages'. Make sure your 'Package Source' is set to nuget.org and go to the 'Browse' Tab and search Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Install whichever version you desire, make sure you note which version you installed. You can learn more about it  here . After installation, deploy your project, make sure the Microsoft.CodeDom.Providers.DotNetCompilerPlatform.d...

Experience of a first time Sitecore MVP

The Journey I have been working in Sitecore for almost 10 years now. When I was a beginner in Sitecore, I was highly impressed by the incredible community support. In fact, my initial Sitecore learning path was entirely based on community written blogs on Sitecore. During a discussion with my then technology lead Neeraj Gulia , he proposed the idea that I should start giving back to developer community whenever I get chance. Just like I have been helped by many developers via online blogs, stackoverflow etc., I should also try to help others. Fast forward a few years and I met  Nehemiah Jeyakumar  (now an MVP). He had a big archive of his technical notes in the form Sitecore blogs. I realized my first blog dont have to be perfect and it can be as simple as notes to a specific problem for reference in future. That's when I probably created my first blog post on Sitecore. At that time, I didn't knew about the Sitecore MVP program. Over the years, I gained more confidence to writ...

Clean Coding Principles in CSharp

A code shall be easy to read and understand. In this post, I am outlining basic principles  about clean coding after researching through expert recommended books, trainings and based on my experience. A common example to start with is a variable declaration like - int i  The above statement did not clarify the purpose of variable i. However,  the same variable can be declared as -  int pageNumber The moment we declared the variable as int pageNumber, our brain realized that the variable is going to store the value for number of pages. We have set the context in our brain now and it is ready to understand what the code is going to do next with these page numbers. This is one of the basic advantages of clean coding. Reasons for clean coding -  • Reading clean code is easier - Every code is revisited after certain amount of time either by the same or different developer who created it. In both the cases, if the code is unclean, its difficult to understand and u...