Extension:MagicNoCache
From MediaWiki.org
|
MagicNoCache Release status: beta |
|
|---|---|
| Implementation | Page action |
| Description | Disables caching for a page |
| Author(s) | Kimon Andreou (Kimon Talk) |
| Version | 1.0.0 (2007-10-29) |
| MediaWiki | Tested on 1.10 |
| License | GPL |
| Download | See below |
| Hooks used |
MagicWordMagicWords |
Contents |
[edit] Description
This extension creates a new magic word __NOCACHE__ and disables the cache for any page in which it finds it.
The extension will attempt to disable the caching of the page by calling the disableCache() function of the Parser object and also the enableClientCache() function of the OutputPage object ($wgOut)
I wrote the extension because I was looking for a way to make sure that specific pages never get cached as they get get updated extremely frequently.
[edit] Installation
- Copy the code below and paste it into a new file called "MagicNoCache.php" in your extensions directory
- Append the following line to the end of your LocalSettings.php file:
require_once( "$IP/extensions/MagicNoCache.php" );
[edit] Source code
<?php #Extension to allow editors to disable caching on select pages #by using the magic word __NOCACHE__ # @addtogroup Extensions # @author Kimon Andreou # @copyright 2007 Kimon Andreou # @license GPL General Public License 2.0 or later #Check to see if we're being called as an extension or directly if ( !defined( 'MEDIAWIKI' ) ) { die( 'This file is a MediaWiki extension, it is not a valid entry point' ); } #register ourselves with Special:Version $wgExtensionCredits['parserhook'][] = array( 'name' => 'MagicNoCache', 'url' => 'http://www.mediawiki/wiki/Extension:MagicNoCache', 'author' => 'Kimon Andreou', 'description' => 'Adds a NOCACHE magic word to disable caching of certain pages.', ); #decalre var to be used for hooks $NoCache = new NoCache(); #register hooks $wgHooks['MagicWordMagicWords'][] = array($NoCache, 'addMagicWord'); $wgHooks['MagicWordwgVariableIDs'][] = array($NoCache, 'addMagicWordId'); $wgHooks['LanguageGetMagic'][] = array($NoCache, 'addMagicWordLanguage'); $wgHooks['ParserAfterStrip'][] = array($NoCache, 'checkForMagicWord'); #extension class class NoCache { #constructor - empty function NoCache() {} #register the new magic word with the system function addMagicWord(&$magicWords) { $magicWords[] = 'MAG_NOCACHE'; return true; } #add the id function addMagicWordId(&$magicWords) { $magicWords[] = MAG_NOCACHE; } #set the magic word for the various languages - English is default #todo: add more languages function addMagicWordLanguage(&$magicWords, $langCode) { switch($langCode) { default: $magicWords[MAG_NOCACHE] = array(0, '__NOCACHE__'); } return true; } #ok, check to see if we have the magic word in the article function checkForMagicWord(&$parser, &$text, &$strip_state) { global $wgOut; $mw = MagicWord::get('MAG_NOCACHE'); #woohoo! we do! - now remove the word from the text if (!in_array($action, array('edit', 'submit')) && $mw->matchAndRemove($text)) { $parser->disableCache(); $wgOut->enableClientCache(false); } return true; } }
[edit] Fix for MediaWiki 1.11.0
The addMagicWordId function needs to return true for this extension to work in Mediawiki 1.11.0. Below is the new function that works.
function addMagicWordId(&$magicWords) { $magicWords[] = MAG_NOCACHE; return true; }
Some other problems when using mediawiki with postgres can be fixed by modifying the function "checkForMagicWord" with...
function checkForMagicWord(&$parser, &$text, &$strip_state) { global $wgOut, $wgRequest; $mw = MagicWord::get('MAG_NOCACHE'); $action = $wgRequest->getVal('action'); #woohoo! we do! - now remove the word from the text
The fix should work, you may need to disable cache in the LocalSettings temporarily before the modifications to start working.
I did find that I got a problem with "unserialized()" in BagOfStuff.php, it seems getting the latest version of Database.php and DatabasePostgres.php fixes the problem.

