This article is might be helpful to WordPress or other CMS plugin developers, where your plugin/module/theme get’s to meet with lot’s of other 3rd party plugins/modules/themes. It’s a great thing, that these CMS systems give you the opportunity to build your website, however these 3rd party applications might not work together well, no one can guarantee that.
Often times I see these plugins conflicting with each other, mostly because of poor coding. When it comes to ajax, you must prepare yourself, because if a notice, warning or some random output swoops in before or after your request, it’s over. Most CMS systems fire up all the plugins before handling your ajax request, so nothing is stopping them to throw notices or print something, that you might not expect, thus poisoning your ajax response.
My very simple solution
On the server side put your response text between delimiters:
function ajax_response() {
$l_delimiter = "!!START!!";
$r_delimiter = "!!END!!";
// Do your stuff here
$response = json_encode(array('hi' => 'Hi dude!'));
print $l_delimiter . $response . $r_delimiter;
}
On the client side, fetch the data between the delimiters:
/**
* jQuery example
*
* Note that the request is handled as text, and then converted to JSON
* */
var post = $.post('http://ajax.url.here', data, function (response) {
// You can of course merge these lines
response = response.replace(/^\s*[\r\n]/gm, "");
response = response.match(/!!START!!(.*[\s\S]*)!!END!!/)[1];
// If you don't need JSON, just skip the line below
response = JSON.parse(response);
// Here the response is in the expected JSON format
console.log(response.hi); // prints "Hi dude!" to the console
}, "text");
This solution might look unusual, but it works really well. You can of course try to play with output buffering on the server side, but I personally prefer this solution instead.
Comments 1
Just want to say thanks for this great tutorial – this helped me make my plugin more compatible even on sites with WPDEBUG enabled…