instagram

Bygg ett eget API på WordPress

WordPress har ingen inbyggd funktionalitet för att visa sitt innehåll via ett API. Det är turligt nog inte speciellt svårt att göra det på egen hand och här är grunden till en api-plugin som visar ut dina poster i ett json-format.

Först behövs en mapp under /plugins/ vi kallar den ”api”, dvs wp-content/plugins/api/. I denna mapp lägger du följande filer.

/wp-content/plugins/api/api.php
/wp-content/plugins/api/api.class.php
/wp-content/plugins/api/api/posts.php

api.php
[php]
/*
Plugin Name: Api
Plugin URI: http://fosseus.se
Description: API
Version: 1.0
Author: johannes
*/
require_once dirname( __FILE__ ) . ‘/api.class.php’;
if (class_exists(‘Api’)){
$api = new Api();
}
[/php]

Därefter lägger vi till klassen, api.class.php

[php]
/*
* API wp-plugin
* http://mikeschinkel.com/blog/restful-web-services-in-wordpress-plugin/
*/
class Api {

function __construct(){
add_action( ‘init’, array( $this, ‘init’ ), -10 );
}

function init(){

define(‘RESTFUL_WEB_SERVICES_DIR’, dirname(__FILE__));
define(‘RESTFUL_WEB_SERVICES_URL_PATTERN’,’api(/?.*)?’);

$abspath = trim(str_replace(‘\\’,’/’,ABSPATH),’/’);
$rest_services_dir = str_replace(‘\\’,’/’,RESTFUL_WEB_SERVICES_DIR);
$rest_services_path = trim(str_replace($abspath,”,$rest_services_dir),’/’);
define(‘RESTFUL_WEB_SERVICES_PATH’, $rest_services_path);

add_action( ‘init’, array($this,’services_flush_rewrite_rules’) );
add_filter(‘generate_rewrite_rules’, array($this,’services_add_rewrite_rules’));
add_action(‘template_redirect’, array($this,’dispatch_service’));
}

// Flush the existing rewrite rules
function services_flush_rewrite_rules(){
global $wp_rewrite;
$wp_rewrite->flush_rules();
}

// Add the rewrite rules
function services_add_rewrite_rules( $wp_rewrite ) {
$new_rules = array(
RESTFUL_WEB_SERVICES_URL_PATTERN => null,
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

// And in the end, dispatch it all and smile
function dispatch_service() {
global $wp;
if ($wp->matched_rule==RESTFUL_WEB_SERVICES_URL_PATTERN){
if ($wp->request == ‘api’) {
die();
} else {
$this->view_service();
}
die();
}
}

// View a single service
function view_service() {
global $wp;
list($dummy,$service_name) = explode(‘/’,$wp->request);
if (file_exists($service_php = (RESTFUL_WEB_SERVICES_DIR . ‘/api/’ . $service_name . ‘.php’))) {
include_once $service_php;
} else {
header(‘Content-Type: text/plain’);
status_header(404);
echo "404";
}
}

}[/php]

Nu skapar vi ytterligare en mapp, direkt i vår plugin. plugins/api/api/ där lägger vi filen posts.php.

[php]
$return = array();
while ( have_posts() ) : the_post();
$item = array( ‘title’ => get_the_title() );
array_push($return,$item);
endwhile;
header(‘Content-type: application/x-json’);
echo json_encode($return);
[/php]

Det är allt som behövs och du kan nu aktivera pluginen som vanligt. Glöm inte att ändra ”Permalink Settings” till ”Day and name” (dvs /-urlar). Surfa till dinsajt.se/api/posts/ så ska du få titlarna på dina poster i ett snyggt json-format.