Skip to content

Instantly share code, notes, and snippets.

@scottopolis
Last active June 22, 2020 19:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scottopolis/d7b654a1ed5d5d49811783b24cc991a7 to your computer and use it in GitHub Desktop.
Save scottopolis/d7b654a1ed5d5d49811783b24cc991a7 to your computer and use it in GitHub Desktop.
Custom API data examples for AppPresser List Pages
<?php
/*
Plugin Name: AppPresser sample API code
Plugin URI: http://apppresser.com
Description: How to manipulate the WP-API for your app.
Version: 0.1
Author: AppPresser Team
Author URI: http://apppresser.com
License: GPLv2
*/
/*
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
// You can uncomment the function below if you are seeing CORS errors
// add_action('send_headers', function() {
// header("Access-Control-Allow-Origin: *");
// });
/****************************************************************************************
* Add featured image urls to post response for custom post types. This is enabled if you activate this plugin.
* Sample usage in the app files would be data.featured_image_urls.thumbnail
****************************************************************************************/
// Uncomment the line below to enable this function. Be sure to change the post type name in the callback function first
// add_action( 'rest_api_init', 'appp_add_featured_urls' );
function appp_add_featured_urls() {
register_rest_field( 'product', // change to your cpt slug. Don't need to add 'post', it's already covered
'featured_image_urls',
array(
'get_callback' => 'appp_featured_images',
'update_callback' => null,
'schema' => null,
)
);
}
function appp_featured_images( $post ) {
$featured_id = get_post_thumbnail_id( $post['id'] );
$sizes = wp_get_attachment_metadata( $featured_id );
$size_data = new stdClass();
if ( ! empty( $sizes['sizes'] ) ) {
foreach ( $sizes['sizes'] as $key => $size ) {
// Use the same method image_downsize() does
$image_src = wp_get_attachment_image_src( $featured_id, $key );
if ( ! $image_src ) {
continue;
}
$size_data->$key = $image_src[0];
}
}
return $size_data;
}
/****************************************************************************************
* Add REST API support to an already registered post type
* http://v2.wp-api.org/extending/custom-content-types/
* Access this post type at yoursite.com/wp-json/wp/v2/post_type_name
****************************************************************************************/
// Uncomment the line below to enable this function. Be sure to change the post type name in the callback function first
// add_action( 'init', 'appp_post_type_rest_support', 999 );
function appp_post_type_rest_support() {
global $wp_post_types;
//be sure to set this to the name of your post type!
$post_type_name = 'product';
if( isset( $wp_post_types[ $post_type_name ] ) ) {
$wp_post_types[$post_type_name]->show_in_rest = true;
$wp_post_types[$post_type_name]->rest_base = $post_type_name;
$wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
}
}
/****************************************************************************************
* Add post meta to a response
* http://v2.wp-api.org/extending/modifying/
* This example adds price to a woocommerce product. Meta key is _price, and corresponding api field will also be _price.
****************************************************************************************/
// Uncomment the line below to enable this function.
// add_action( 'rest_api_init', 'appp_register_post_meta' );
function appp_register_post_meta() {
register_rest_field( 'product', // any post type registered with API
'_price', // this needs to match meta key
array(
'get_callback' => 'appp_get_meta',
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Get the value of a meta field field
*
* @param array $object Details of current post.
* @param string $field_name Name of field.
* @param WP_REST_Request $request Current request
*
* @return mixed
*/
function appp_get_meta( $object, $field_name, $request ) {
return get_post_meta( $object[ 'id' ], $field_name, true );
}
/****************************************************************************************
* How to use an AppPresser template hook
****************************************************************************************/
// Uncomment the line below to enable this function.
// add_action( 'rest_api_init', 'appp_register_template_hook' );
function appp_register_template_hook() {
register_rest_field( 'post', // any post type registered with API
'appp',
array(
'get_callback' => 'appp_get_hook_data',
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Get the value of a meta field field
*
* @param array $object Details of current post.
* @param string $field_name Name of field.
* @param WP_REST_Request $request Current request
*
* @return mixed
*/
function appp_get_hook_data( $object, $field_name, $request ) {
$data = [];
// Add a featured image to the single post view in the app
$data['post_detail']['above_title'] = '<div class="post-featured-wrap">' . get_the_post_thumbnail( $object['id'], 'large', array( 'class' => 'post-featured' ) ) . '</div>';
return $data;
}
/**
* Add REST API support to an already registered taxonomy.
* If you register a custom taxonomy, you can find it at yoursite.com/wp-json/wp/v2/taxonomyname
* You can filter custom post type queries by taxonomy like this: yoursite.com/wp-json/wp/v2/cptname?taxonomyname=value
*/
// add_filter( 'register_taxonomy_args', 'sb_taxonomy_args', 999, 2 );
function sb_taxonomy_args( $args, $taxonomy_name ) {
if ( 'accessories' === $taxonomy_name ) {
$args['show_in_rest'] = true;
$args['query_var'] = true;
// Optionally customize the rest_base or rest_controller_class
$args['rest_base'] = $taxonomy_name;
$args['rest_controller_class'] = 'WP_REST_Terms_Controller';
}
return $args;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment