Skip to content

Instantly share code, notes, and snippets.

@retgef
Created June 24, 2012 07:46
Show Gist options
  • Star 41 You must be signed in to star a gist
  • Fork 17 You must be signed in to fork a gist
  • Save retgef/2982319 to your computer and use it in GitHub Desktop.
Save retgef/2982319 to your computer and use it in GitHub Desktop.
Pug Bomb API Endpoint WordPress Plugin
<?php
/*
Plugin Name: Pug Bomb API Endpoint
Description: Adds an API endpoint at /api/pugs/$n_pugs
Version: 0.1
Author: Brian Fegter
Author URL: http://coderrr.com
*/
class Pugs_API_Endpoint{
/**
* @var string Pug Bomb Headquarters
*/
protected $api = 'http://pugme.herokuapp.com/bomb?count=';
/** Hook WordPress
* @return void
*/
public function __construct(){
add_filter('query_vars', array($this, 'add_query_vars'), 0);
add_action('parse_request', array($this, 'sniff_requests'), 0);
add_action('init', array($this, 'add_endpoint'), 0);
}
/** Add public query vars
* @param array $vars List of current public query vars
* @return array $vars
*/
public function add_query_vars($vars){
$vars[] = '__api';
$vars[] = 'pugs';
return $vars;
}
/** Add API Endpoint
* This is where the magic happens - brush up on your regex skillz
* @return void
*/
public function add_endpoint(){
add_rewrite_rule('^api/pugs/?([0-9]+)?/?','index.php?__api=1&pugs=$matches[1]','top');
}
/** Sniff Requests
* This is where we hijack all API requests
* If $_GET['__api'] is set, we kill WP and serve up pug bomb awesomeness
* @return die if API request
*/
public function sniff_requests(){
global $wp;
if(isset($wp->query_vars['__api'])){
$this->handle_request();
exit;
}
}
/** Handle Requests
* This is where we send off for an intense pug bomb package
* @return void
*/
protected function handle_request(){
global $wp;
$pugs = $wp->query_vars['pugs'];
if(!$pugs)
$this->send_response('Please tell us how many pugs to send.');
$pugs = file_get_contents($this->api.$pugs);
if($pugs)
$this->send_response('200 OK', json_decode($pugs));
else
$this->send_response('Something went wrong with the pug bomb factory');
}
/** Response Handler
* This sends a JSON response to the browser
*/
protected function send_response($msg, $pugs = ''){
$response['message'] = $msg;
if($pugs)
$response['pugs'] = $pugs;
header('content-type: application/json; charset=utf-8');
echo json_encode($response)."\n";
exit;
}
}
new Pugs_API_Endpoint();
@robivictor
Copy link

Hello there, thank you for the wonderful post about API endpoints in side wordpress which I found it hard to find some documentation or code snippets. I am hoping this will do what I want. I just need to serve a JSON response of custom database tables inside mysql. How do I actually make the request, and where should this file be inside my plugin? A sample plugin using this endpoint will be useful. Thank you.

@fbeenaerts
Copy link

Dear Brian,

How could I call it from jqeury ajax?
I have an application in Java (same domain) and I want to allow access to this Java application when the user is logged in Wordpress.
So I created an API as you suggested, and I use the wp_get_current_user() in this API.

If I call the API directly from a browser, then it returns me the logged user of Wordpress. If I call it via Ajax in a jquery (JSP page), I don't get that user back.

Hope you can help me and wishing you all the best for 2016

Thanks for an answer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment