Making a MediaWiki Theme

I love MediaWiki. I’ve been using it for MedRevise since 2007.

After 3 years of using a hacked up version of someone else’s theme, I decided to make my own theme. It was a big learning process, and I decided to share my knowledge… Unfortunately, 5 years ago, I stopped writing this how-to halfway through. It was for MediaWiki version 1.17.

Since then, there have been like 7 new major versions, and everything in “Code” I’ve written is hopelessly out of date. But the first three sections still have some value: Planning, Designing and Layout – so I thought I would publish it anyway.

Make your own Mediawiki theme

Ever thought it would be nice/useful to have your own wiki? There are lots of different bits of software out there for running a wiki, but the big one is MediaWiki – the same one used by Wikipedia. Now, your problem is that there are only so many ready made themes for MediaWiki. And there aren’t many good tutorials on doing it yourself. The tutorials out there are sparse at least.

So I’m going to give it a go, and I’ll explain it to you as I go. I warn you, this is aimed at an intermediate level. I am not going to explain how a div works, how to use CSS or much of that. Go to the amazing w3schools website for tutorials on these basics.

First things first.

There are four key stages to making any website:


You need to ask yourself some questions:

  • What is your website for? If there is a lot of information, you need to give prevalence to the content section, if there are lots of sections, maybe the menu needs extra prominence.
  • Who will use it? Is it going to be aimed at people new to the web, in which case it needs to be very clear and understandable. If its aimed at geeks, you maybe can play with the appearance more.
  • What will code put in? Database driven sites such as a wiki will need to import information. This information is usually of different sizes and lengths, in which case you will need to have an expandable or scrolling area for this information. Examples are menus, footer tags and content divs. Once you have really thought it out, get a piece of paper, and start sketching out some ideas, taking into account all your stuff above. Once you have a good idea, you can start…


Get yourself a good web graphics program. Photoshop isn’t really ideal here, lacking many of the measurement, image optimisation and slicing options that Fireworks has. But yeh, that’s my plug over. Get designing, and put in all the elements you think you need. Put in text and everything, and try to have all the text on a separate layer, so you can show the layout later without it. (If you don’t understand this, you’ll get it in the next step). Here is my first design for the new MedRevise:

Mockup of the design for the site.

Now, that is really very lovely. At least I think so, and its my site, so blah! And while I’m on the subject of accepting criticism, now is the time to get friends, families and geeks to look at this and give you feedback, before you spend hours putting it in code and everyone hates it. If you need a geek to ask, feel free to contact me.

Once your mum has finished telling you to add more flowers, and you are happy with your design, you can move onto…


You now need to turn your image into a web page. The first step is getting rid of all your text. Simple click the “eye” symbol next to your text layer, and you should end up with something like the image on the right:

Now, this step is complex, time consuming and laborious. It involves making all your divs and everything. I have chosen a very complicated design here, and I will not explain how to do everything. I will upload a tutorial at some point explaining how I got my middle div working, because I’m quite proud of that.

But basically, you want to end up with a site where you have your template design set up, with text tags saying “Insert Menu Code Here”, and “Insert Content Code Here”. In my case, I have decided to have a difficult left hand menu, so I will have to manually code changes to it, rather than having the option of mediawiki manually inserting the code for you.

Either way, you should end up with somewhat that looks like this… Screenshot of the finished template You might notice that I have moved my footer bar into the middle, as I realised it will work better there. Aside from this, I have kept it relatively close to my original design. I have also tested in in Firefox, Chrome, IE6, IE7 and IE8, to ensure that the majority of people accessing the site get to see it correctly. Use to do this yourself (its awesome).


The final stage is making your theme do the things you want it to do. This can often take you as long, if not longer than everything else put together.

First off, go and read the MediaWiki manual on skinning.

Then start working through the article, changing it as you go through. I began by tackling the preheader. I used the following code:

* MedRevise skin
* @version 4.0.0
* @author Chris Lowry ( /
* @license Attribution-Noncommercial 3.0 Unported

// initialize
if( !defined( 'MEDIAWIKI' ) ){
die( "This skin file is not a valid entry point.\n" );

#Only needed for older MediaWiki instances

// inherit main code from SkinTemplate, set the CSS and template filter
class SkinMedRevise extends SkinTemplate {
function initPage( OutputPage $out ) {
parent::initPage( $out );
$this->skinname = 'medrevise';
$this->stylename = 'medrevise';
$this->template = 'MedReviseTemplate';

class MedReviseTemplate extends QuickTemplate {
/* hijack category functions to create a proper list */

function getCategories() {
$catlinks = $this->getCategoryLinks();
if( !empty( $catlinks ) ) {
return "<ul id='catlinks'>{$catlinks}</ul>";

function getCategoryLinks() {
global $wgOut, $wgUser, $wgTitle, $wgUseCategoryBrowser;
global $wgContLang;

if( count( $wgOut->mCategoryLinks ) == 0 )
return '';

$skin = $wgUser->getSkin();

# separator
$sep = '';

// use Unicode bidi embedding override characters,
// to make sure links don't smash each other up in ugly ways
$dir = $wgContLang->isRTL() ? 'rtl' : 'ltr';
$embed = "<li dir='$dir'>";
$pop = '</li>';
$t = $embed . implode( "{$pop} {$sep} {$embed}", $wgOut->mCategoryLinks ) . $pop;

$msg = wfMsgExt( 'pagecategories', array( 'parsemag', 'escape' ), count( $wgOut->mCategoryLinks ) );
$s = $skin->makeLinkObj( Title::newFromText( wfMsgForContent( 'pagecategorieslink' ) ), $msg )
. $t;

# optional 'dmoz-like' category browser - will be shown under the list
# of categories an article belongs to
if( $wgUseCategoryBrowser ) {
$s .= '<br /><hr />';

# get a big array of the parents tree
$parenttree = $wgTitle->getParentCategoryTree();
# Skin object passed by reference because it can not be
# accessed under the method subfunction drawCategoryBrowser
$tempout = explode( "\n", Skin::drawCategoryBrowser( $parenttree, $this ) );
# clean out bogus first entry and sort them
unset( $tempout[0] );
asort( $tempout );
# output one per line
$s .= implode( "<br />\n", $tempout );

return $s;

* Template filter callback for this skin.
* Takes an associative array of data set from a SkinTemplate-based
* class, and a wrapper for MediaWiki's localization database, and
* outputs a formatted page.
public function execute() {
global $wgUser, $wgSitename, <span style="color: #ff0000;">$wgTitle</span>;
$skin = $wgUser->getSkin();

// retrieve site name
$this->set( 'sitename', $wgSitename );

// suppress warnings to prevent notices about missing indexes in $this->data

Now, I’ll be honest, I didn’t understand most of that. However, the Mediawiki walkthrough explained it nicely, and pretty much all I did was change the FooBar and foobar tags to MedRevise and medrevise. I also added $wgTitle to the execute function. I needed that for my login menu later. That done, it was time to chuck in the HTML header:

/* compose XHTML output */
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<html xmlns="<?php $this->text('xhtmldefaultnamespace') ?>" <?php
foreach( $this->data['xhtmlnamespaces'] as $tag => $ns ) {
?>xmlns:<?php echo "{$tag}=\"{$ns}\" ";
} ?>xml:lang="<?php $this->text('lang') ?>" lang="<?php $this->text('lang') ?>" dir="<?php $this->text('dir') ?>">
<meta http-equiv="Content-Type" content="<?php $this->text('mimetype') ?>; charset=<?php $this->text('charset') ?>" />
<?php $this->html('headlinks') ?>
<title><?php $this->text('pagetitle') ?></title>
<?php /*** general style sheets ***/ ?>
<style type="text/css" media="screen,projection">/*<![CDATA[*/
@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/main.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";
@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/contents.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";
<?php /*** media-specific style sheets ***/ ?>
<link rel="stylesheet" type="text/css" <?php if(empty($this->data['printable']) ) { ?>media="print"<?php } ?> href="<?php $this->text('stylepath') ?>/common/commonPrint.css?<?php echo $GLOBALS['wgStyleVersion'] ?>" />
<link rel="stylesheet" type="text/css" media="handheld" href="<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/handheld.css?<?php echo $GLOBALS['wgStyleVersion'] ?>" />
<?php print Skin::makeGlobalVariablesScript($this->data); ?>
<?php /*** various MediaWiki-related scripts and styles ***/ ?>
<script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('stylepath') ?>/common/wikibits.js?<?php echo $GLOBALS['wgStyleVersion'] ?>"><!-- wikibits js --></script>
<?php if($this->data['jsvarurl']) { ?>
<script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('jsvarurl') ?>"><!-- site js --></script>
<?php } ?>
<?php if($this->data['pagecss']) { ?>
<style type="text/css"><?php $this->html('pagecss') ?></style>
<?php }
if($this->data['usercss']) { ?>
<style type="text/css"><?php $this->html('usercss') ?></style>
<?php }
if($this->data['userjs']) { ?>
<script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('userjs' ) ?>"></script>
<?php }
if($this->data['userjsprev']) { ?>
<script type="<?php $this->text('jsmimetype') ?>"><?php $this->html('userjsprev') ?></script>
<?php }
if($this->data['trackbackhtml']) print $this->data['trackbackhtml']; ?>
<!-- Head Scripts -->
<?php $this->html('headscripts') ?>
<!-- Cufon Scripts -->
<script src="<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/js/cufon-yui.js" type="text/javascript"></script>
<script src="<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/js/Blippo.font.js" type="text/javascript"></script>
<script type="text/javascript">

I will be the first to admit that looks pretty awful. All you need to know is that you leave it basically untouched, simply adding the correct path to your style sheet, if necessary (I just had to rename mine to main.css), then add any scripts you want to add yourself at the end. I use cufon for font replacement, so I chucked that in at the end.

Next comes the nitty gritty, making individual bits and pieces appear exactly where you want them. I first decided to tackle the search bar, altering the code in the tutorial, and simplifying it because I only want one search button, not two.

I then worked out my login details section, and wrote some conditional code to do one thing when logged in, and another when logged out.

Thanks for reading, I hope its helpful to anyone who needs some (rather dated) hackery!

Low Cost Holidays – unbelievably bad customer service

lowcostholidaysA few years ago, me and Katherine went on holiday with a low cost company that managed to pretty much ruin our holiday.

They are called Low Cost Holidays. I think a more apt name is Low Quality Holidays, with terrible customer service thrown in

A bad start

Our apartment had:

I contacted the company after our third night with no sleep, after my wife started crying because of how little fun she was having. The representative I spoke to was friendly and understanding: “Go find some other accommodation, keep the receipt, and we will fully refund you on your return”.

That got worse

Our next week of holiday, in a self catering flat next to the beach, was great. My experience with Low Cost Holidays, on returning back to England, was less good.

They flat out denied my request for compensation. Repeatedly.

They denied that their customer service representative had spoken to me, or authorised me to stay in alternative accomodation. Even when I provided them with itemised phone records showing the exact time, date and duration of my 35 minute call to their number, on my mobile from the Canary Islands, they denied that the offer had taken place. They were uninterested in the photos documenting the poor quality of the hotel, nor my hotel stamped initial complaint letter.

Eventual success

Over the course of a year, I wrote 6 letters, and spent around 10 hours of my time on the matter. Eventually, after threatening to take them to the small claims court, they finally agreed to pay the £300 they owed my for the accommodation- but refused the £300+ that I was claiming for my time and expenses (such as filing small claims, lost time doing freelance work).

I decided that it was no longer worth my time fighting any more, and laid the matter to rest until…

A ridiculous request

In September, I received an email threatening legal action from the formerly mentioned untrustworthy holiday company. In the email they said:

Links from your site have been identified to us as malicious or spam content and we request the immediate removal of any links directed to

We request immediate action or our legal team will seek removal. Please notify us with an email once action has been taken.

I explained that the link was probably in a post complaining about the terrible service I received. I asked they simply pay the money I was still owed, and links would be removed.

Making things worse

A month later they went to my excellent, high quality hosting company, and tried to get the links removed. In this email they lied and said “we haven’t managed to find the correct contact details for the site owner“, and asked them to remove the links.

In going over my head, and lying about previously contacting me, they clearly broke the law, as well as proved themselves to be the scumbag, disreputable company they had already proven themselves to be.

And then even worse…

They then offered my hosting company money to remove the links without my permission! Pretty sure that’s totally illegal, and definitely immoral regardless. They offered £25 per link. At this point, I was a bit angry. I think you can understand why.

However. I am currently volunteering in Africa, and I could do with the money, so here is my response:

Dear Low Cost,

In the above post, you can clearly see that your behaviour has been, at best, shady, and at worst, actually illegal. You still owe me around £350 for my time spent chasing your company after you broke your word.

That said, My family and I are currently volunteering in South Africa to help some of the poorest people in the world with healthcare. I don’t officially have a job yet, so I could do with a little extra income.

You offered my hosting company £25 per link. There are currently 14 links = £350. You already owe me £350 anyway, in case that wasn’t clear. Pay me that which you owe me, and I’ll remove all the links to your company, and, beyond an acknowledgement of your gracious behaviour, never publicly comment on the matter again.

How does that sound? Pay up, and I may even consider going on holiday with you again…

Dr Chris Lowry

WordCamp Sheffield 2014

If you’ve read my blog in the past, you know that I’m a huge fan of WordPress, and before we moved to Boston, an active member of the Sheffield WordPress User Group.

Today, I’ve attended the UK National WordCamp, which has been hosted by some of my friends from my time at the user group in Sheffield. Myself and my friend Dave drank lots of coffee, jumped in the car with Iron Maiden on the stereo, and popped over for the day.

Wordcamp Sheffield

What on earth are you talking about?

For those of you who don’t know what I’m waffling  about, WordPress is basically software for managing a website, most often for running a blog. It’s open source, free software, which anyone can use with no fees. Unlike many online projects, there is a really active community of people who use it.

There’s also an ethos “Code is Poetry“, which is about an appreciation of the beauty and satisfaction that can come from creating and using good technology. The WordPress team name major releases after jazz musicians, and often release haikus celebrating version updates.

(I actually keep track of all these hiakus on my page “All the WordPress Haikus“…)

So, despite Joen waking me up at 5am, we still left late, and even after we hurriedly dropped off my dog with a friend, and walked/ran down to the Mappin building in Sheffield we were just in time… to completely miss the first talk. However, the second talk was on…

Theme Development Workflow from start to finish

Jonny A photoThis talk was from Wonderflux framework creator Jonny Allbut (on twitter as @jonnyauk). It was a pretty informative talk with lots of interesting points from his personal experience as a professional WP developer of many years.

Key points I took out:

  • I really need to learn how to use Version Control (especially Git).
  • Separating non essential-to-theme items out of the functions.php and putting them as seperate plugins can help with future proofing as well as clarity.

The Challenges of managing a Multi-Author Blog

Samantha DeakinSamantha Deakin (@SamanthaJDeakin) gave us a talk about the challenges and pitfalls of running a multi user blog – the award winning

Didn’t write it all down, but some key points were that of encouraging frequent contributions (in their case, by having 7 paid interns!) and developing a culture of regular blogging. Some surprising revelations about authors not being aware that stealing other people’s blog posts from across the internet is not cool…

Wow Plugins

kimbWPSheffield organiser, Make Do operator and generally well dressed and nice smelling. He was talking about his favourite plugins, alongside lots of irritating internetz speekz [sic].

Common plugins:

Contact forms:

  • Gravity forms
  • Contact form 7


  • WooCommerce
  • Many of the others have fallen by the wayside somewhat. WP eCommerce is falling out of date


  • WP SEO (Yoast)
  • Hypercache

Jetpack is 20 plugins in one. People seem to either love or hate it.

Buddypress is also a very cool plugin – people forget that it is just a plugin because it does so much stuff.

WP Remote allows awesome management of all your different sites, managing updates, users, etc.

Cool other plugins

  • Hammy, is a responsive images plugin that works pretty awesomely.
  • Custom Field Suite – a lightweight custom fields plugins. If you want something that is more than a title and a WYSIWYG edit for a post, then this does the magic all for you. Definitely something I’ve been wanting to look for, rather than writing all the code to set up these things mannually.
  • Spots – a little text editor that can do tiny bits of magic, for updating little snippets across your site.
  • Really Static – generates a whole static site from your blog. Faster than any other cache…! Doesn’t work with things that need AJAX.

Live demo

Kimb demonstrated some plugins live next. Predictably, he immediately broke his site trying to run a Change Table Prefix plugin, but he assured us it usually works really well.IMG_20140426_130352

  • Imsanity is a bulk image resizer that works brilliantly, I already use it, but didn’t realise it could reduce jpeg quality settings too, which saves a lot of space..
  • CMS Page Tree View plugin looks like a nice way of making your site pages more navigable in the admin area.
  • TablePress is definitely better than copying and pasting tables directly from word, but still not ideal. The best there is currently though…
  • Ultimate Coming Soon Plugin – creates a holding page that blocks all views from anyone not logged in.

Following  a vast amount of pie and Henderson’s Relish at lunch, and chats with some of the sponsors – pipe (10) – find out more at – it was time for the afternoon sessions. After being told that my live blog has been added to the  I decided to be brave and move into the smaller side stream and catch…

A Simpler WordPress Admin for Clients

Mark WIlkinson PhotoMark Wilkinson (@wpmark) reveals that there are loads of functions built into WordPress to help tidy up the interface for n00b users.

Step 1: Hiding WordPress Stuff that gets in the way

There are several things that can make WordPress hard work for users. A key way to make things easier is removing unnecessary menu items from the admin menu. For example, removing the “Comments” menu item, or the “Updates” submenu item, or random widgets.

This can be done through the WP core, with tags like remove_submenu_page($menu_slug, $submenu_slug):, and remove_meta_box ($id,$page,$context);.

Step 2: Enhance or improve what WordPress gives you

Mark gives us an example of renaming field titles and changing Meta Boxes to make things more obvious. For example, changing the “Featured image” box on a new Slide post type to be called a “Slide image”.Mark gesticulating fabulously

There’s lots of fun functions to do this, with functions along the line of remove_meta_box(); and, unsurprisingly, add_meta_box();. When adding new meta boxes, you need to use the update_post_meta(); tag to update the correct field in the correct post.

All that theory explained, his advice is to use the Custom-Meta-Boxes code available for include at Github, which does all the hard work for you.

He also showed us how to simply use a function to change login logo through hitting up the login_head hook, and adding new items to admin menu pages, even links to non WP pages or resources, using add_menu_page();.

Step 3: Provide Help

Supporting the client from right within the Dashboard “What happens in terms of help after my site goes live?”, “Can I call you if this goes wrong?”.

You could create a top level Menu called “Help”, adding a list of useful articles, or links to informational videos. You can also use the WP-Help plugin

Improving frontend performance in WordPress

Ian ParrIan Parr on Twitter (@devolute) as a user interface guru, tells us his favourite aspects of WordPress.

Have you read the article “Responsive Web Design” was step one. Ian has sold his sold at the altar of responsive web design, and asks: “Have you embraced RWD methodologies into your heart?” How many of us are building all our sites responsive? A show of hands showed about 50% of us are.

A responsive design isn’t limited to layout changes
Ethan Marcotte

WordPress has responded well to RWD, with Twenty 12, Twenty 14 all fully responsive. Website performance is an essential part of modern UX, which WP is not so hot on. Using Google Page Speed Insights, WordPress installed on Twenty 14, scores 60/100, decreasing year on year.

  • Amazon’s stats show that adding 100ms = -1% sales loss. He also showed us his Wishlist, with 55 gallons of water based lubricant a key item.
  • Etsy stats show +160k to a page = +12% bounce rate on mobile.
  • Google have said that speed is going to be linked to their rankings.

Ian fears that WordPress is falling behind in performance terms. Lots of the work in this is best sorted in the front end. How to solve problems:

Step 1 – Admit you have a problem.

Step 2 – Use the Chrome web developer tools. Some pretty cool tips from Ian on how to use these.

Easy tips:

  • Limit the number of DNS requests. They are expensive – regardless of your bandwidth, they tend to be expensive in terms of time (and battery life on mobile).
  • Limit the size of those requests.
  • G-Zip, files compressed, so less data sent. Can be set up with .htaccess tricks.
  • Encourage caching
  • Minify files for css/jss by removing whitespace.
  • Concatenation can reduce number of requests.
  • Sprites can reduce requests by combining images.
  • Performance led design and client education.

His final point is that there is a lot we can do to improve WordPress performance, but there is still a more that can be done to Core. For example, why can’t wp-enqueue_style() automatically concatenate and minify files?

Hitchikers Guide to Custom Post Types

Jenny WongJenny Wong (@miss_jwo) speaking on the fact that Custom Post Types (or CPT) is what turned WordPress from a Blog Platform to a fully fledged Content Management System.


  • Hides content from the default query.
  • Management of content is easier.
  • Improved user interface & usability.
  • Ability to use custom templates.


  • Performance issue with querying a large table.
  • If content doesn’t easily fit a post type, could potentially cause problems.

Best place to set up custom post types?

  1. In the functions.php of the theme – theme can be deactivated, post types disappear, or if clients use Christmas theme, CPTs will disappear.
  2. As a plugin – but then users can accidentally deactivate or delete the plugin.
  3. An an mu-plugin – “Must Use” plugins can’t be deleted or deactivated without file access.


Dave Allan
My friend Dave says “Hi!”

Religion vs Jesus (video)

[iframe 715 393]

I don’t pretend to have all the answers to Christianity, but I often find church a distraction, Christians a frustration, and – more importantly – antithetical to many of Jesus’ statements. This video makes that point fairly admirably.

Also, from a purely aesthetic perspective, there is some beautiful flow and rhyme in this, with great visuals, and a subtle but supportive typographical underlay. If that’s your sort of thing…

Five places to waste your time

Have you got a list of a million items on your to do list? Welcome to my world…

The internet is a wonderful invention, but it can be used for good or evil. In the midst of trying to get stuff done, I’m constantly distracted by other things to click on, to read, to learn about.

“It’s a job that’s never started that takes the longest to finish.”
~J. R. R. Tolkien

Twitter is my absolute No 1 stop for distraction, but its such an amazing/terrible invention that I’ll give it a post all its own at some another time. For now (and as a further piece of procrastination) here is a list of five of my favourite sites for wasting my time:


Lifehacker is a fantastic place to read interesting articles about becoming more productive. It’s hacking your life: literally trying to reset how we function, and find more efficient ways of living life. Of course, if you mostly just read Lifehacker when you should be working, its going to be, rather depressingly ironically, totally counterproductive.

Favourite bits:  Why Coffee May Not Be HelpingWallpaper WednesdaysAlways Up To Date Guide For Rooting Any Android Phone, The Headphone Cable Hack


Slashdot logo

Slashdot was named specifically to be annoying to pronounce. Try saying ” HTTP colon slash slash WWW dot SLASH DOT dot ORG” – fun, eh? That’s pretty geeky, and a perfect introduction to the site, which gives news about tech, web and geekdom, with a slant towards open source. I find it a great place to fantasise about having the tech chops to be a true sysadmin – even if I suspect I’ll never get further than running my own home server.  The comments are also always detailed, informative and entertaining.

Favourite bits: Ask Slashdot – users post their own technical challenges for community help, Slashdot Polls – see large scale responses to tech questions that relate to life. Also, check out the Quotes right at the bottom of each page.


Engadget logo

A lot more polished than Slashdot, Engadget is my place to learn about all the exciting new shiny gadgets that are coming to the world over the next few months. Despite the fact I never buy any of them, and generally have no desire to own one, I still read in depth reviews of new phones, laptops and gizmos frequently, when I could be better spending my time.

Favourite bits: Generally just enjoying reading the latest articles, but the Reviews are my favourite, regardless of the item. Engadget is also my preferred source of Liveblog when there’s a new Apple/Google/Palm/etc launch event.

BBC News & Timeslive

BBC & Times live logosAs a little bit of a news addict, I tend to visit two main sites: BBC News for my UK hit, and Timeslive for South African snippets. The BBC are blatantly the best news organisation in the world, and their site is a testament to that – its currently the fifth most visited site in the UK. Whilst less well written, I enjoy visiting the SA Times website to get an inside flavour of how things are going in South Africa: since we are planning to move there, its good to know when a government department can’t account for £100 million of its budget.

Favourite bits: The front page of each is my main port of call, but I also rather enjoy the BBC’s Science & Environment section, and Times Live coverage of SA Politics. When I want to feel especially low, BBC Sport are always there for me with the latest Orient scores


Of all the sites mentioned here, Reddit is the only one I’m slightly ashamed of. The self styled “front page of the internet”, it is a community, much like Slashdot, where articles and links are upvoted to gain precedence on the site. However, it has a much more puerile mix of images, links and comments. I’m a recent convert from Digg to Reddit, and whilst I spend less time on reddit than on the others above, it’s definitely a good destination if you urgently need to put off doing something. I refuse to register an account or I’ll never get anything done again!

Favourite bits: The never ending stream of irrelevance that is the front page, but also AskReddit, where people present their real world problems and are *generally* supported, encouraged and helped, with a sprinkling of sarcasm and trolling.


So, there we go. I hope this list helps you to not achieve something in your life quite soon. Just reading this post has probably been a good start!

New page: MarketPress Grid Plugin

I‘ve been hanging out over at the WPMU-DEV forums quite a lot over the last few months, and I decided to contribute to the community with an update of one of the plugins for MarketPress.

MarketPress is a pretty good, simple e-commerce plugin for WordPress, but it lacks a grid layout option. This plugin adds that feature.

Anyway check out the new page, where you can download version 0.3 of the MarketPress Grid Plugin.