Extension:MagicNoCache

From MediaWiki.org

Jump to: navigation, search
Manual on MediaWiki Extensions
List of MediaWiki Extensions
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
MagicWordwgVariableIDs
LanguageGetMagic
ParserAfterStrip

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

  1. Copy the code below and paste it into a new file called "MagicNoCache.php" in your extensions directory
  2. 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.

Personal tools