Caching systems like the one here ->
http://www.theukwebdesigncompany.com/articles/php-caching.phpcould very easely be implemented in the template.
What a basic caching system does, in plain english is:
look if page allready was asked
-- if not - create it and store it in cache
serve it from cache
So basicly only the templates index.php needs to be changed
At the start there should be some code to check if there is a cached file and if it is not too old,
if it is not there make a chached page and show that
if it is show the cached page
I have allready implemented something like that ages ago, hence the pointer to the search in the forum, but I can't find it myself anymore, so it might be too old to be still here in the forum.
But I have a copy...

, I made it in 2005.
Since such a simple cache system can't tell if it needs to show dynamic info you just need a copy of the same template.
One WITH caching and ONE without, the siteadmin needs to set the caching template as default and those pages wich has dynamic content can be set to noncaching.
The code I used, at the very beginning of the templates index.php
<?php
// Caching settings Settings
$cachedir = WB_PATH.'/cache/'; // Directory to cache files in
$cachetime = 600; // Seconds to cache files for
$cacheext = 'cache'; // Extension to give cached files (usually cache, htm, txt)
$ignore_list = array( // Ignore List
'/search',
);
$page = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // Requested page
$cachefile = $cachedir . md5($page) . '.' . $cacheext; // Cache file to either load or create
$ignore_page = false;
for ($i = 0; $i < count($ignore_list); $i++) {
$ignore_page = (strpos($page, $ignore_list[$i]) !== false) ? true : $ignore_page;
}
$cachefile_created = ((@file_exists($cachefile)) and ($ignore_page === false)) ? @filemtime($cachefile) : 0;
@clearstatcache();
if (time() - $cachetime < $cachefile_created) { // Show file from cache if still valid
@readfile($cachefile);
exit();
} else {
if (@file_exists($cachefile)) { // Delete old cache file
unlink ($cachefile);
}
}
ob_start(); // If we're still here, we need to generate a cache file
and et the very end:
<?php
$cachedir = WB_PATH.'/cache/'; // Directory to cache files in (keep outside web root)
$cacheext = 'cache'; // Extension to give cached files (usually cache, htm, txt)
$page = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // Requested page
$cachefile = $cachedir . md5($page) . '.' . $cacheext; // Cache file to either load or create
$cachecontent=ob_get_contents(); // save the contents of output buffer to the file
ob_end_flush();
$fp = fopen($cachefile, 'w'); // Now the script has run, generate a new cache file
fwrite($fp, $cachecontent); // save the contents of output buffer to the file
fclose($fp);
?>
I am not sure why I include the same settings at beginning and end, could be cause I was less experienced or that some variables got lost during the building.
However, make sure both sets of settings are the same!!
Have fun,
John