using wordpress custom pages for service templates

I was reading a discussion elsewhere on a rest service plugin for wordpress. Problem seemed that wordpress kept rerouting all requests to index.php. Most wordpress installs use server modules for url rewriting, where .htaccess contains a rule that checks first if a file exists on the server that matches the request. If it doesn’t, wordpress handles it. Unless you write an extra .htaccess rule to direct requests to the service endpoint, you have to have all endpoint files present under the request name. That’s awkward.

using custom pages

You can solve that by masking your service as a page. WordPress tests if the file exists as ‘single’ (page or post), and if a page exists with that permalink, wordpress generates the page.

I can write custom templates for pages. That template can be any file, so it can also be the main request handler of the REST service.

If I place my request handler in the template directory with a remark

/* Template Name: XMLServices
  1. */

then wordpress adds it to the custom pages list, that I can use on the backend when I add a new page.

custom content-type headers

Services usually reply with json or xml data, and not with wordpress content pages. I need a custom file header.
black magic

No problem, if I leave get_header(); out of the page template, I can specifiy my own header and use an text/xml content type or vcard text/directory content type.

I made a small example by adding my twitter friends timeline as xml output to the blog menu, by placing a file xmlservices.php in the template directory :

/* Template Name: XMLServices
  1. */
  2.  
  3. $x = simplexml_load_file('http://www.juust.org/friends_timeline.xml');
  4. if($x) {
  5.  
  6. //make the XML-header :
  7. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
  8. header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
  9. header("Cache-Control: no-cache, must-revalidate" );
  10. header("Pragma: no-cache" );
  11. header("Content-type: text/xml");
  12.  
  13. //make some xml :
  14. $xml = "< ?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
  15. $xml .= "<rows>";
  16. $xml .= "<page>1</page>";
  17. $xml .= "<total>15</total>";
  18. foreach($x->status as $s) {
  19.  $xml .= "<row id='".$s->user->id."'>";
  20.  $xml .= "<cell>< ![CDATA[".$s->source."]]></cell>";  
  21.  $xml .= "<cell>< ![CDATA[".$s->text."]]></cell>";
  22.  //$xml .= "<cell>< ![CDATA[".$s->user->screen_name."]]></cell>";    
  23.  $xml .= "<cell>< ![CDATA[".$s->user->name."]]></cell>";  
  24.  $xml .= "<cell>< ![CDATA[".$s->user->screen_name."]]></cell>";  
  25.  $xml .= "<cell>< ![CDATA[".$s->user->followers_count."]]></cell>";  
  26.  $xml .= "</row>";  
  27. }
  28.  
  29. $xml .= "</rows>";
  30. echo $xml;
  31. } else {
  32. //no data, relocate to the blog index or something
  33. }

Then added a page services with xmlservices as template. I can make a whole tree of xml service pages, as long as I use my XMLServices template when I make the page. You can use both http-get-queries and http-post.

Adding a vCard

wordpress custom page You can also add your  vcard, if you work business to business that comes in very handy.

I picked Troy Wolf’s vcard class of the net, made a file vcard.php with vcard as Template Name and put it in the template directory.

/* Template Name: vcard
  1. */
  2.  
  3. //include the class file
  4. include('../../../classes/vcard.class.php');
  5. //here we go : add my personal data
  6. $vc = new vcard;
  7. $vc-&gt;display_name ='Juust';//….
  8. $vc-&gt;download();

I added a empty new page with ‘about’ as parent and vcard as custom template, published it and now anyone can download my vCard straight from the ‘about’ menu.