Inventory_Presser_REST
On This Page
Description Description
Adds routes to the REST API at /wp-json/invp/
Source Source
File: includes/class-rest.php
class Inventory_Presser_REST {
/**
* add_hooks
*
* @return void
*/
public function add_hooks() {
/*
Adds
/invp/v1/settings
/invp/v1/feed-complete routes.
*/
add_action( 'rest_api_init', array( $this, 'add_routes' ) );
// Adds the inventory_type_slugs field to the response of the /wp-json/wp/v2/inventory_vehicle route.
add_action( 'rest_api_init', array( $this, 'add_inventory_type_slugs_to_posts' ) );
// Allow attachments to be ordered by the inventory_presser_photo_number meta value.
add_filter( 'rest_attachment_collection_params', array( $this, 'allow_orderby_photo_number' ) );
add_filter( 'rest_attachment_query', array( $this, 'orderby_photo_number' ), 10, 2 );
if ( defined( 'INVP::POST_TYPE' ) ) {
// Allow vehicles to be returned in a random order.
add_filter( 'rest_' . INVP::POST_TYPE . '_collection_params', array( $this, 'allow_orderby_rand' ) );
// Prevent REST API warnings when vehicles are deleted during request processing.
add_filter( 'rest_prepare_' . INVP::POST_TYPE, array( $this, 'handle_null_post' ), 10, 3 );
}
}
/**
* Adds an attribute `inventory_type_slugs` to the response of the
* /wp-json/wp/v2/inventory route.
*
* @return void
*/
public function add_inventory_type_slugs_to_posts() {
register_rest_field(
INVP::POST_TYPE,
'inventory_type_slugs',
array(
'get_callback' => array( $this, 'get_the_type_slugs' ),
'schema' => array(
'description' => __( 'The type taxonomy term slugs.', 'inventory-presser' ),
'type' => 'string',
),
)
);
}
/**
* Adds the photo_number meta field to the allowed orderby values.
*
* @param array $params
* @return array
*/
public function allow_orderby_photo_number( $params ) {
$params['orderby']['enum'][] = apply_filters( 'invp_prefix_meta_key', 'photo_number' );
return $params;
}
/**
* Allow vehicles to be returned in a random order.
*
* @param array $query_params
* @param WP_Post_Type $post_type
* @return array
*/
public function allow_orderby_rand( $query_params ) {
$query_params['orderby']['enum'][] = 'rand';
return $query_params;
}
/**
* Given a post object, returns the term slugs of the type taxonomy.
*
* @param array $post_object An array representing a post object.
* @return array Term slugs of the type taxonomy.
*/
public function get_the_type_slugs( $post_object ) {
$terms = get_the_terms( $post_object['id'], 'type' );
if ( is_array( $terms ) ) {
return wp_list_pluck( $terms, 'slug' );
}
return array();
}
/**
* Handles deleted vehicles in REST API responses to prevent warnings.
*
* When a vehicle is deleted during a REST API request (e.g., via skip trash
* setting), the post object may be null when WordPress tries to prepare
* the response. This filter catches null posts early and returns an error
* response instead of allowing WordPress to generate warnings.
*
* @param WP_REST_Response $response The response object.
* @param WP_Post|null $post The post object, or null if deleted.
* @param WP_REST_Request $request The request object.
* @return WP_REST_Response|WP_Error The response or an error if post is null.
*/
public function handle_null_post( $response, $post, $request ) {
// If the post is null or not a valid post object, return an error.
if ( ! $post || ! is_a( $post, 'WP_Post' ) ) {
return new WP_Error(
'rest_null_or_invalid',
__( 'The vehicle has been deleted or is no longer available.', 'inventory-presser' ),
array( 'status' => 410 ) // 410 Gone.
);
}
return $response;
}
/**
* Changes the query args for requests to order attachments by the
* photo_number meta key.
*
* @param array $args Array of arguments for WP_Query.
* @param WP_REST_Request $request The REST API request.
* @return array
*/
public function orderby_photo_number( $args, $request ) {
$order_by = $request->get_param( 'orderby' );
if ( isset( $order_by ) && apply_filters( 'invp_prefix_meta_key', 'photo_number' ) === $order_by ) {
$args['meta_key'] = $order_by;
$args['orderby'] = 'meta_value_num'; // user 'meta_value_num' for numerical fields.
}
return $args;
}
/**
* Adds /invp/v1/settings & /invp/v1/feed-complete routes.
*
* @return void
*/
public function add_routes() {
register_rest_route(
'invp/v1',
'/settings/',
array(
'methods' => 'GET',
'callback' => array( $this, 'response_settings' ),
'permission_callback' => '__return_true',
)
);
register_rest_route(
'invp/v1',
'/feed-complete/',
array(
'methods' => 'PUT',
'callback' => array( $this, 'response_feed_complete' ),
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
)
);
}
/**
* Creates the response data for the /feed-complete/ route.
*
* @return array
*/
public function response_feed_complete() {
/**
* A successful PUT request to /wp-json/invp/v1/feed-complete has
* occurred. Assume a client has just updated the entire list of
* inventory posts and attachments.
*/
do_action( 'invp_feed_complete' );
// Tell the user what just happened.
return array(
'action' => 'invp_feed_complete',
'documentation' => 'https://inventorypresser.com/docs/reference/hooks/invp_feed_complete/',
);
}
/**
* Creates the response data for the /settings/ route.
*
* @return array
*/
public function response_settings() {
if ( ! class_exists( 'INVP' ) ) {
return array();
}
$public_keys = array(
'use_carfax',
);
return array_filter(
INVP::settings(),
function ( $k ) use ( $public_keys ) {
return in_array( $k, $public_keys, true );
},
ARRAY_FILTER_USE_KEY
);
}
}
Expand full source codeCollapse full source codeView on Github
Methods Methods
- add_hooks — add_hooks
- add_inventory_type_slugs_to_posts — Adds an attribute `inventory_type_slugs` to the response of the /wp-json/wp/v2/inventory route.
- add_routes — Adds /invp/v1/settings & /invp/v1/feed-complete routes.
- allow_orderby_photo_number — Adds the photo_number meta field to the allowed orderby values.
- allow_orderby_rand — Allow vehicles to be returned in a random order.
- get_the_type_slugs — Given a post object, returns the term slugs of the type taxonomy.
- handle_null_post — Handles deleted vehicles in REST API responses to prevent warnings.
- orderby_photo_number — Changes the query args for requests to order attachments by the photo_number meta key.
- response_feed_complete — Creates the response data for the /feed-complete/ route.
- response_settings — Creates the response data for the /settings/ route.