Preparing for the upcoming Meandre release, as part of the larger SEASR on, I have been exploring a bit the inner machinery of WordPress to create a simple plugin for the SEASR site that could render Meandre component and flow descriptions straight out of their RDF desciptors. Actually, it turned out to be a breeze.

After being a heavy user of WordPress in several project for few years now, its extensibility keeps sparking new possibilities in my mind every time I look into any of its facets. Anyway, I am rambling. Back to the point. To hit the ground running, I started by creating a simple generic plugin that would replace a tag with parameters for something else. I looked into several freely available plugins, the one that got me going was a very simple one, the SlideShare plugin by Joost de Valk.

The plugin transforms a formated tag into code that embed a flash player for SlideShare presentation. Below, I reproduce the skeleton of a plugin that will replace the tags in your post/pages/comments for whatever you like. A tag takes the form [tag-mnemonic param1 param2] and the plugin replaces it by just a HTML list of the two parameters.

*   ###Param1###
*   ###Param2###

function sp\_plugin\_callback($match) {
    $output = SP\_TARGET;
    $output = str\_replace("###Param1###", $match\[1\], $output);
    $output = str\_replace("###Param2###", $match\[2\], $output);
    return ($output);
} 

function sp\_plugin($content) {
    return (preg\_replace\_callback(SP\_REGEXP, 'sp\_plugin\_callback', $content));
}

add\_filter('the\_content', 'sp\_plugin'); 
add\_filter('comment\_text', 'sp\_plugin'); 

That means that if you write the tag [tag-mnemonic http://foo.org http://example.org], the plugin will reformat the tag and inject the following html code

<ul>
    <li>http://foo.org</li>
    <li>http://exampl.org</li>
</ul>

where the tag originally was. And that’s it! One more thing. The only thing you may want to be aware is the filtering chain. The add_filter has a third numeric parameter. When you have multiple plugins that rely on filters to do their job, sometimes you may need to force a certain order of execution to avoid stepping on each others toes. If that is your case, you better check the add_filter documentation. It may save you some time, trust me :D