I am running into a problem which baffles me as much as it irritates me. I'm coding a very simple pluging which will automatically insert the proper HTML for an image aligned left, right or in the centre of the page; and with or without caption. The format goes like so
[image link="..." width="..." loc="..." caption="..."]
After a spot of trouble with quotes within quotes and shutting off the WYSIWYG-editor, I managed to get the code working. Except, except for one mysterious bug.
If I activate my plugin, and let WordPress apply it to a post, then the post will not display the body of the text if it contains more than a certain, variable number of words after I've first used the shortcode. I see the header, I see the comments, but the body of the post is completely blank. The addition of a single letter in a paragraph, as if it were a word, is sufficient to trigger the displaying or not of the blog contribution. If I deactivate the plugin, or render the shortcode dysfunctional by adding a letter to it (so it is no longer recognised as my shortcode), then the text reappears and can be as long as I want it to be.
If I look at the source with my browser (either FF 3.6.x, FF 3.5.x or some ancient IE 6.x—yes, I know, I only keep it around for this sort of weirdness—) then the body is simply not there. WordPress is not sending it out.
I have truly no idea what is happening here. I cannot even imagine why I'm seeing the behaviour as I do. I am not under the impression that the code I wrote is faulty, but obviously something is amiss. I'm posting the code here in a vain hope that someone will be able to pinpoint a problem; if there is no obvious problem then someone might want to log on to my test blog. It's currently password protected and all that as I don't want the URL to get out yet, so drop me a line in case you need access.
<?php
class BCode {
function BCode()
{
if (!function_exists('add_shortcode'))
return;
add_shortcode('foto',array(&$this,'shortcode_foto'));
}
/* Foto shortcode
* Foto has attributes link (= filename), width (in px), loc (left, right, center),
* and caption (some text). Caption is optional. There are no
* default values.
*
*/
function shortcode_foto($atts=array(),$content=NULL)
{
extract($atts);
if (isset($link) && isset($loc) && isset($width)) {
if ($loc=='left' || $loc=='right' || $loc=='center') {
$width=(int)$width; // superfluous, I know
$link='http://bloggfx.localhost/'.$link;
$loc='align'.$loc;
if (isset($caption))
$i='<div class="wp-caption '.$loc.'" style="width: '.(10+$width).'px"><img class="size-full" src="'.$link.'" width="'.$width.'"/><p class="wp-caption-text">'.$caption.'</p></div>';
else
$i='<img class="'.$loc.' size-full" src="'.$link.'" width="'.$width.'" />';
}
}
// Here I either return a formatted-string or some easily
// discernable error text.
if (isset($i))
return $i;
else
return '<span style="color: red;"><strong>[FOTOERROR]</strong></span>';
}
}
// Start this plugin once all other plugins are fully loaded
add_action( 'plugins_loaded', create_function( '', 'global $BCode; $BCode = new BCode();' ) );
?>