Files
old-v2-backend/wordpress/wp-content/plugins/acf-to-wp-api/acf-to-wp-api.php
2018-06-25 00:00:37 +02:00

561 lines
13 KiB
PHP

<?php
/**
* Plugin Name: ACF to WP API
* Description: Puts all ACF fields from posts, pages, custom post types, attachments and taxonomy terms, into the WP-API output under the 'acf' key
* Author: Chris Hutchinson
* Author URI: http://www.chrishutchinson.me
* Version: 1.4.0
* Plugin URI: https://wordpress.org/plugins/acf-to-wp-api/
*/
class ACFtoWPAPI {
/**
* @var object $plugin All base plugin configuration is stored here
*/
protected $plugin;
/**
* @var string $apiVersion Stores the version number of the REST API
*/
protected $apiVersion;
/**
* Constructor
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @since 1.4.0 Improved API version checking
* @since 1.3.3 Compatibility fix for V2.0Beta9
* @since 1.3.0 Updated to support version 2 of the WP-API
* @since 1.0.0
*/
function __construct() {
// Setup defaults
$this->plugin = new StdClass;
$this->plugin->title = 'ACF to WP API';
$this->plugin->name = 'acf-to-wp-api';
$this->plugin->folder = WP_PLUGIN_DIR . '/' . $this->plugin->name;
$this->plugin->url = WP_PLUGIN_URL . '/' . str_replace(basename( __FILE__), "", plugin_basename(__FILE__));
$this->plugin->version = '1.4.0';
$this->apiVersion = $this->_getAPIVersion();
// Version One
if($this->_isAPIVersionOne()) {
$this->_versionOneSetup();
}
// Version Two
if($this->_isAPIVersionTwo()) {
$this->_versionTwoSetup();
}
}
/**
* Die and dump
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param mixed $data The data to be dumped to the screen
*
* @return void
*
* @since 1.3.0
*/
private function dd($data) {
if( WP_DEBUG ) {
echo '<pre>';
print_r($data);
echo '</pre>';
die();
}
}
/**
* Adds the required filters and hooks for version 1 of the REST API
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.0
*/
private function _versionOneSetup() {
// Filters
add_filter( 'json_prepare_post', array( $this, 'addACFDataPost'), 10, 3 ); // Posts
add_filter( 'json_prepare_term', array( $this, 'addACFDataTerm'), 10, 3 ); // Taxonomy Terms
add_filter( 'json_prepare_user', array( $this, 'addACFDataUser'), 10, 3 ); // Users
add_filter( 'json_prepare_comment', array( $this, 'addACFDataComment'), 10, 3 ); // Comments
// Endpoints
add_filter( 'json_endpoints', array( $this, 'registerRoutes' ), 10, 3 );
}
/**
* Adds the required filters and hooks for version 2 of the REST API
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.0
*/
private function _versionTwoSetup() {
// Actions
add_action( 'rest_api_init', array( $this, 'addACFDataPostV2' ) ); // Posts
add_action( 'rest_api_init', array( $this, 'addACFDataTermV2' ) ); // Taxonomy Terms
add_action( 'rest_api_init', array( $this, 'addACFDataUserV2' ) ); // Users
add_action( 'rest_api_init', array( $this, 'addACFDataCommentV2' ) ); // Comments
add_action( 'rest_api_init', array( $this, 'addACFOptionRouteV2') );
}
/**
* Returns the WP REST API version, assumes version 2
* if can't find any other version
*
* @return string The version number, set by WP REST API
*
* @since 1.3.2
*/
private function _getAPIVersion() {
$version = 2;
if ( defined('REST_API_VERSION') ) {
$version = REST_API_VERSION;
} else {
$version = get_option( 'rest_api_plugin_version', get_option( 'json_api_plugin_version', null ) );
}
return $version;
}
/**
* Gets the version number of the WP REST API
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return int The base version number
*
* @since 1.3.0
*/
private function _getAPIBaseVersion() {
$version = $this->apiVersion;
if( is_null( $version ) ) {
return false;
}
$baseNumber = (int) substr( $version, 0, 1 );
if( $baseNumber > 0 ) {
return $baseNumber;
}
return false;
}
/**
* Check if the current API base version is version 1
*
* @return boolean True if the current API version is 1
*
* @since 1.3.0
*/
private function _isAPIVersionOne() {
if($this->_getAPIBaseVersion() === 1) {
return true;
}
return false;
}
/**
* Check if the current API base version is version 2
*
* @return boolean True if the current API version is 2
*
* @since 1.3.0
*/
private function _isAPIVersionTwo() {
if($this->_getAPIBaseVersion() === 2) {
return true;
}
return false;
}
/**
* Add data to users
*
* @param array $data The current ACF data
* @param int $user The ID of the user
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataUser( $data, $user, $context ) {
$data['acf'] = $this->_getData( $user->ID, 'user' );
return $data;
}
/**
* Add data to terms
*
* @param array $data The current ACF data
* @param int $term The ID of the term
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataTerm( $data, $term, $context = null ) {
$data['acf'] = get_fields( $term, 'term' );
return $data;
}
/**
* Add data to Posts, Custom Post Types, Pages & Attachments
*
* @param array $data The current ACF data
* @param int $post The ID of the record
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataPost( $data, $post, $context ) {
$data['acf'] = $this->_getData( $post['ID'] );
return $data;
}
/**
* Registers the `acf` field against posts
*
* @return void
*
* @since 1.3.2 Adds support for pages and public custom post types
* @since 1.3.0
*/
function addACFDataPostV2() {
// Posts
register_rest_field( 'post',
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
// Pages
register_rest_field( 'page',
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
// Public custom post types
$types = get_post_types(array(
'public' => true,
'_builtin' => false
));
foreach($types as $key => $type) {
register_rest_field( $type,
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
}
/**
* Returns the ACF data to be added to the JSON response posts
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataPostV2()
*
* @since 1.3.0
*/
function addACFDataPostV2cb($object, $fieldName, $request) {
return $this->_getData($object['id']);
}
/**
* Registers the `acf` field against taxonomy terms
*
* @return void
*
* @since 1.3.0
*/
function addACFDataTermV2() {
register_rest_field( 'term',
'acf',
array(
'get_callback' => array( $this, 'addACFDataTermV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for taxonomy terms
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataTermV2()
*
* @since 1.3.0
*/
function addACFDataTermV2cb($object, $fieldName, $request) {
return $this->_getData($object['id'], 'term', $object);
}
/**
* Registers the `acf` field against users
*
* @return void
*
* @since 1.3.0
*/
function addACFDataUserV2() {
register_rest_field( 'user',
'acf',
array(
'get_callback' => array( $this, 'addACFDataUserV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for users
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataUserV2()
*
* @since 1.3.0
*/
function addACFDataUserV2cb($object, $fieldName, $request) {
return $this->_getData( $object['id'], 'user' );
}
/**
* Registers the `acf` field against comments
*
* @return void
*
* @since 1.3.0
*/
function addACFDataCommentV2() {
register_rest_field( 'comment',
'acf',
array(
'get_callback' => array( $this, 'addACFDataCommentV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for comments
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataCommentV2()
*
* @since 1.3.0
*/
function addACFDataCommentV2cb( $object, $fieldName, $request ) {
return $this->_getData( $object['id'], 'comment' );
}
/**
* Returns an array of Advanced Custom Fields data for the given record
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param int $id The ID of the object to get
* @param string $type The type of the object to get
* @param array $object The full object being requested, only required for specific $types
*
* @return array The Advanced Custom Fields data for the supplied record
*
* @since 1.3.0
*/
private function _getData($id, $type = 'post', $object = array()) {
switch($type) {
case 'post':
default:
return get_fields($id);
break;
case 'term':
return get_fields($object['taxonomy'] . '_' . $id);
break;
case 'user':
return get_fields('user_' . $id);
break;
case 'comment':
return get_fields('comment_' . $id);
break;
case 'options':
return get_fields('option');
break;
}
}
/**
* Registers the routes for all and single options
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.1 Switched to array() notation (over [] notation) to support PHP < 5.4
* @since 1.3.0
*/
function addACFOptionRouteV2() {
register_rest_route( 'wp/v2/acf', '/options', array(
'methods' => array(
'GET'
),
'callback' => array( $this, 'addACFOptionRouteV2cb' )
) );
register_rest_route( 'wp/v2/acf', '/options/(?P<option>.+)', array(
'methods' => array(
'GET'
),
'callback' => array( $this, 'addACFOptionRouteV2cb' )
) );
}
/**
* The callback for the `wp/v2/acf/options` endpoint
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param WP_REST_Request $request The WP_REST_Request object
*
* @return array|string The single requested option, or all options
*
* @see ACFtoWPAPI::addACFOptionRouteV2()
*
* @since 1.3.0
*/
function addACFOptionRouteV2cb( WP_REST_Request $request ) {
if($request['option']) {
return get_field($request['option'], 'option');
}
return get_fields('option');
}
/**
* Returns data for comments (WP API v1)
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $data The response data to be extended
* @param object $comment The comment being requested
* @param string $context The context the data is being requested in
*
* @return array The extended $data array, with ACF data
*
* @since 1.1.0
*
*/
function addACFDataComment($data, $comment, $context) {
$data['acf'] = $this->_getData('comment_' . $comment->comment_ID);
return $data;
}
/**
* Returns data for options (WP API v1)
*
* @author github.com/kokarn
*
* @return array The options data
*
* @since 1.1.0
*
*/
function getACFOptions() {
return get_fields('options');
}
/**
* Returns a single option based on the supplied name (WP API v1)
*
* @author github.com/asquel
*
* @param string $name The option name being requested
*
* @return mixed The data for the supplied option
*
* @since 1.3.0
*/
function getACFOption($name) {
return get_field($name, 'option');
}
/**
* Registers additional routes (WP API v1)
*
* @author github.com/kokarn
*
* @return array The routes data
*
* @since 1.1.0
*
*/
function registerRoutes( $routes ) {
$routes['/option'] = array(
array( array( $this, 'getACFOptions' ), WP_JSON_Server::READABLE )
);
$routes['/options'] = array(
array( array( $this, 'getACFOptions' ), WP_JSON_Server::READABLE )
);
$routes['/options/(?P<name>[\w-]+)'] = array(
array( array( $this, 'getACFOption' ), WP_JSON_Server::READABLE ),
);
return $routes;
}
}
$ACFtoWPAPI = new ACFtoWPAPI();