WordPress heeft al een tijdje de mogelijkheid om WordPress via een REST API te benaderen. Via de REST API kun je data in WordPress niet alleen uitlezen maar ook bewerken. Op deze manier wordt WordPress meer dan een Content Mamagement Systeem voor websites, maar kan het ook worden ingezet voor bijvoorbeeld het beheren van de content voor apps en andere toepassingen.
Waar vind ik informatie?
De meeste informatie over de laatste API versie (versie 2) kun je vinden op http://v2.wp-api.org/. Hier vindt je de complete documentatie hoe je de REST API kunt installeren en gebruiken, links naar andere plugins en het gebruik van de javascript REST client.
Welke routes zijn er beschikbaar?
Heb je de REST API plugin geïnstalleerd en geactiveerd dan kun je via [jouwdomein]/wp-json/ een overzicht krijgen welke routes er beschikbaar zijn op jouw website.
Uitschakelen van alle standaard REST routes
Wil je ervoor zorgen dat je alle standaard REST routes uitschakeld dan dien je de volgende 3 regels in de functions.php van je active thema te zetten.
remove_action( 'init', '_add_extra_api_post_type_arguments', 11 ); remove_action( 'init', '_add_extra_api_taxonomy_arguments', 11 ); remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );
Toevoegen van alle postmeta data
De REST API is zo gemaakt dat via de API een aantal standaard velden kunnen worden opgehaald. Wil je meer informatie dan kun je die toevoegen met de “register_rest_field” methode. Hieronder zie je een voorbeeld.
<?php if (!defined('ABSPATH')) { exit; } if (!class_exists('REST_extender')) { class REST_extender { public function __construct() { } public function hooks() { add_action('rest_api_init', array($this, 'register_routes')); } function register_routes() { register_rest_field('post', 'postmeta', array( 'get_callback' => array($this, 'wp_api_v2_get_meta_values'), 'update_callback' => null, 'schema' => null ) ); register_rest_field('page', 'postmeta', array( 'get_callback' => array($this, 'wp_api_v2_get_meta_values'), 'update_callback' => null, 'schema' => null ) ); } /* * Function to get add all the postmeta inside the json */ function wp_api_v2_get_meta_values($object, $field_name, $request) { $values = []; $fields = get_post_custom($object['id']); foreach ($fields as $key => $value) { $obj = new stdClass; $obj->name = $key; $obj->value = $value[0]; $values[] = $obj; } return $values; } } } if (class_exists('REST_extender')) { // instantiate the plugin class $rest_ext = new REST_extender(); $rest_ext->hooks(); }
Toevoegen van een eigen route
Wil je meer eigen route maken, dan kun je die toevoegen met de “register_rest_route” methode. Hieronder zie je een voorbeeld.
<?php if (!defined('ABSPATH')) { exit; } if (!class_exists('REST_extender')) { class REST_extender { public function __construct() { } public function hooks() { add_action('rest_api_init', array($this, 'register_routes')); } function register_routes() { register_rest_route('menus/v2', '/menus/(?P<id>[a-zA-Z(-_]+)', array( 'methods' => 'GET', 'callback' => array($this, 'wp_api_v2_menus_get_menulocation_data') )); } /* * Function to get all the menu based on the id */ function wp_api_v2_menus_get_menulocation_data($data) { $menu = new stdClass; $locations = get_nav_menu_locations(); $menu_id = $locations[$data['id']]; if ($menu_id != false) { $menu = wp_get_nav_menu_object($menu_id); $menu->items = wp_get_nav_menu_items($menu->term_id); } return $menu; } } } if (class_exists('REST_extender')) { // instantiate the plugin class $rest_ext = new REST_extender(); $rest_ext->hooks(); }
Filters parameters toevoegen
Standaard kun je met de REST API op een aantal velden filteren om zo de juiste posts of pages te vinden. Uitbreiden kan echter. Op https://codex.wordpress.org/Class_Reference/WP_Query kun je een lijst vinden met mogelijke parameters. Met de “rest_query_vars” methode kun je deze variabele toevoegen aan de tegestaande filters. Dit gaat in de code als volgt:
add_filter( 'rest_query_vars', 'my_allow_meta_query'); function my_allow_meta_query( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value' , 'meta_compare') ); return $valid_vars; }
Vervolgens kun je bijv. met de url “/wp-json/wp/v2/pages/?filter[meta_key]=_wp_page_template&filter[meta_value]=homepage.php” de pagina ophalen met het template homepage.