Skip to main content

Digital Transformation

Scheduling Future Item Publishing in Sitecore

Whenever we work with a client on a Sitecore implementation, it is inevitable that at some point in the process, the question of scheduling future publishes will come up.  The question is usually phrased something like “Does Sitecore allow me to schedule an item to be published in the future?”  Every time it comes up, I have to chuckle a little to myself, because of the answer that immediately pops into my head.  That answer is “Well, out of the box, sort of, kind of, but not really, no, at least not in an effective real-world manner.  But yes, that can be done.”  And I legitimately think that’s the “right” answer.

I know, you’re now saying to yourself, “How can that be the right answer?  You said yes and no and yes again all at the same time, and still managed to not really say much of anything.”  Well, let me explain.  Out of the box, Sitecore gives the content editors the ability to restrict the publication of any given item (or even specific versions of an item) right in the desktop.  To see this in action, navigate to the “Publish” menu of the Sitecore Desktop Ribbon, and click the Change button in the Restrictions section.  You will get a pop-up that now lets you put in dates for both when an item should go live, and if necessary, when it should be removed from  being live.  The following screenshot shows a portion of this popup:

 Sitecore Publish Restrictions

So, now you’ve got to be thinking “That’s awesome, but doesn’t that answer the original question with a resounding ‘Yes’?”  It sure seems to, except for one little caveat – there’s nothing out of the box with Sitecore that does automatic publishing.  So, given the example in our image above, the current item is only to be published between 3/12/12 at 1:30PM and 3/30/12 at 12:30AM, and that’s what will happen when a content manager explicitly publishes the site.  The first time the site is published after 3/12/12 1:30PM, the item I’ve modified above will be published – so if that first time is 3/15 at 8:30PM, then we had 3+ days where our item wasn’t published, but should’ve been.  Likewise, the first publish explicitly performed after 3/30/12 12:30AM will automatically remove our item from being published, but our item won’t disappear a second before that first publish.  This can be a little misleading to content managers who stumble upon the first screen on their own, as it seems to indicate a positive answer to the question “Does Sitecore allow me to schedule an item to be published in the future?”  It’s important that we, as developers make sure they’re aware of exactly what that publish restriction date does and does not do.

So, I think that details the “sort of, kind of, but not really, no” portion of my answer – now let’s get to the “But yes, that can be done” portion, which is obviously the part clients care most about – the “Yes, I can help you make that happen” part.  A coworker of mine has written some code that when called by a scheduled task, will perform a smart publish on a given site.  The code is thus:

   private void PerformSmartPublish()
         string ProductionWeb = ConfigurationManager.AppSettings["ProductionSiteCoreDB"];

         Database dbSource = Sitecore.Configuration.Factory.GetDatabase("master");
         Database dbTarget = Sitecore.Configuration.Factory.GetDatabase(ProductionWeb);

         Language[] dbLanguages = dbSource.Languages;

         Database[] dbTargets = new Database[] { dbTarget };

         PublishManager.PublishSmart(dbSource, dbTargets, dbLanguages);

Once you’ve got that code, you simply need to put it in a place that allows you to call it in a schedulable way.  There are lots of options to do this.  One way is to call the above code from a particular webpage that, while publically accessible, is not publicized as  a part of your Sitecore site (IE: a page that no one knows exists).  Once you have that page, you can schedule a windows task to call your page at a regular interval, and it will automatically perform a smart publish on your site.

Now you have the means to allow Content Managers to administer date restrictions on when items should be published through the Sitecore desktop, and a means to do automatic publishing through a small bit of custom code.  It’s important to note the ramifications of a scheduled publish though.  If your site requires that content goes live at the same time on any given day, you can get away with having your scheduler only call the above code once a day at the proper time.  This should be completely acceptable, and really happen without a hitch.  However, what if your site might need content that goes live at 8:30AM, or 8:45AM, or 12:17PM, or any other arbitrary time of any given day?  Well, then you need your scheduled task to run much more frequently – possibly once every minute.  It’s certainly possible to set your task up to do this, but there will absolutely be an increased amount of processing strain placed on your server to run this code continuously.  Having the ability to publish automatically whenever we want to does not make doing so a best practice.   Another consideration that needs to be clearly communicated to all of your Content Editors when implementing an automatic publish feature is how it affects their items.  Any item that is not in a non-final workflow state, and doesn’t have publishing restrictions upon it will be published by the above code.  That means, if you have your auto-publish scheduled to run at 8:00AM every day, and a content editor saves a change to an item (without any workflow attached to it) at 7:59AM, but does not intend for that item to be published right away, they will be out of luck, because it will be published automatically.

We should be prudent here and say that implementing the above code alone does not preclude a content manager from explicitly performing their own Sitecore publish at anytime they wish.  Our code could be used as the sole means of publishing by removing publish rights from all content editor permissions within Sitecore, thus ensuring that the site is only published when it is scheduled to be.  Our code can just as easily be used in addition to “on-demand” publishes performed by content managers to help prevent items that should be published / unpublished on a schedule missing their target dates.  If you have content managers who are really on the ball, it’s also conceivable they will do regular publishes when they need to be done and you don’t have to implement an auto-publish at all.  Each Sitecore implementation should have its own business rules relating to the publishing of content, and those rules should dictate the methodology that is used.

So, the next time you hear someone ask (or have the question yourself) “Does Sitecore allow me to schedule an item to be published in the future?”, you can feel free to quote me by saying “Well, out of the box, sort of, kind of, but not really, no, at least not in an effective real-world manner.  But yes, that can be done.”, and have confidence that yes, this can be done without a lot of effort!

Thoughts on “Scheduling Future Item Publishing in Sitecore”

  1. As you of course know, this is functionality that was implemented for the news releases section for the relaunch of…and so far so good – it works very well and makes it much easier for the content team to design pages ahead of time and schedule those items to be published at specific times. Thanks for the expertise.

  2. Jamie Stump Post author

    Thanks, your post is good as well! In our experience, many clients are more comfortable knowing the timing of auto-publishes, IE: the publish will take place at 6:00AM every day. As you state at the top of your own post, auto publishing can be dangerous without workflows in place. We’ve worked with clients who had no need for workflows based on their business rules, these clients are most definitely more comfortable knowing a time based system. That way they’re safe to think something like: “As long as I have all my edit’s done by 7PM on Thursday, I don’t have to worry about a publish pushing content mistakenly, because I know that’s exactly when my site gets published”. To my knowledge, the Sitecore publishing agent only allows an “interval” of how often it will run (IE: Every hour, every 12 hours, etc.), and is dependent upon Sitecore staying alive to run. We’ve had some bad experiences with Sitecore staying alive consistently that would render the publishing agent nearly useless, and at the very least not dependable.

  3. We use this shared source module: to do what you are describing here. It has an on item save handler that creates a scheduled publish task anytime a “future publish” item is saved. Then your schedule publish only takes place when it needs to. It also only publishes the item that needs to be published (i.e. not a full site smart publish)

  4. A colleague of mine actually mentioned the same issue today, and apparently we’ve implemented custom code for this too (run by a scheduled task item in Sitecore though, not a Windows service).
    Makes me wonder how many other companies implemented this feature – and that maybe Sitecore should extend the existing PublishAgent to handle the scenario 🙂

  5. @UliW. I totally agree with you and that is a good point I wonder exactly how many companies have implemented this feature as well it’s an interesting thought

  6. Jamie Stump Post author

    Mahbubur – as I pointed out to Uli above, the post you’ve referenced describes publishing at a certain interval, but not during a certain timeframe. Our clients often want to know that their content will be published between certain hours (generally off-business hours), like 2-3 AM each day. The post you’ve referenced can’t ensure that the publishing happens at that time each day, because the timespan will reset anytime the Sitecore process is “rebooted” (which can happen more than you’d expect). The example I’ve detailed above will instead ensure exactly what time each day the publish will happen.

    Thanks for your comment!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Jamie Stump

My name is Jamie Stump, and I am a Senior Sitecore Consultant at Perficient. I was honored to be named one of only 42 2013 Sitecore MVP’s worldwide. I specialize in Sitecore Architecture and Development and my broad Sitecore experience includes Sitecore installation, configuration and CEP development, including custom DMS implementations for clients. I have implemented Sitecore solutions for a number of industry verticals including manufacturing, healthcare, financial services, advertising and retail. In addition to architecting and implementing Sitecore sites and eCommerce solutions, I also work with other Microsoft Technologies, including the .NET platform and SQL Server. You can read through my older Sitecore related blog posts here and my newer ones here. I graduated with a Bachelor of Science in Information Systems Development from York College of PA. I am originally from the suburbs of Philadelphia, PA, and still reside there with my wife, son, English bulldog and 2 cats.

More from this Author

Follow Us