For a long time, the practice of "hard-coding" blocks into your theme template has been the generally accepted solution to the problem of having block content on all pages (either across the entire site or of a certain page type) and ensuring that site editors don't need to remember to add it and also prevent them from accidentally removing it or changing its settings.

Heck, I even wrote a blog post a while back that went into detail on how to do this with the autonav block.

But since then, I've come around and realized that hard-coding blocks in theme templates is not a good idea, for several reasons:

  1. Hardcoding blocks bypasses C5 caching. This can be especially problematic for autonav menus on very large sites.
  2. Most blocks cannot actually be successfully hard-coded. There are many reasons why this might be the case, but the biggest one is that it only works if there is a single table of data in the block's database schema (db.xml file). So blocks that contain multiple sub-items (such as the built-in "slideshow" block and most image galleries on the marketplace) just plain don't work and there's no way to make them work. This inconsistency about how some blocks work and others don't only makes theme development more confusing than it already is for newbies.
  3. It is challenging to figure out exactly what the available settings are for a block, and there is generally very little documentation. Your best bet is to examine the block's db.xml file, but even knowing what the fields are doesn't necessarily tell you what valid values are.

Fortunately, there is a solution available that works all the way back to Concrete5.5: use a "Global Area" and disable its editing controls on all pages except the "Page Defaults", like so:

$a = new GlobalArea('Your Area Name');
if ($c->getMasterCollectionID() != $c->getCollectionID()) {

Once you have that in your theme template, go to the dashboard "Page Defaults" for any page type that it appears on and place the block into the area there. Now it will show up on all pages, and users will not be able to remove it or change its settings when in edit mode. Plus, it works in almost every situtuation and you get to leverage C5's caching. Sweet!