From 77802d05f288c5be656fe2045fb2b1faf720f12d Mon Sep 17 00:00:00 2001 From: Brian Miyaji Date: Mon, 11 Apr 2016 19:47:42 +1000 Subject: [PATCH] Add rest api methods for data stored as multidimensional arrays --- includes/api/class-sp-rest-api.php | 137 +++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 9 deletions(-) diff --git a/includes/api/class-sp-rest-api.php b/includes/api/class-sp-rest-api.php index 7205732d..7b0aad51 100644 --- a/includes/api/class-sp-rest-api.php +++ b/includes/api/class-sp-rest-api.php @@ -118,6 +118,22 @@ class SP_REST_API { ) ); + register_rest_field( 'sp_event', + 'minutes', + array( + 'get_callback' => 'SP_REST_API::get_post_data', + 'update_callback' => 'SP_REST_API::update_post_meta', + 'schema' => array( + 'description' => __( 'Full Time', 'sportspress' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit', 'embed' ), + 'arg_options' => array( + 'sanitize_callback' => 'absint', + ), + ), + ) + ); + register_rest_field( 'sp_event', 'players', array( @@ -154,7 +170,7 @@ class SP_REST_API { 'results', array( 'get_callback' => 'SP_REST_API::get_post_data', - 'update_callback' => 'SP_REST_API::update_post_meta', + 'update_callback' => 'SP_REST_API::update_post_meta_arrays', 'schema' => array( 'description' => __( 'Results', 'sportspress' ), 'type' => 'array', @@ -170,7 +186,7 @@ class SP_REST_API { 'performance', array( 'get_callback' => 'SP_REST_API::get_post_data', - 'update_callback' => 'SP_REST_API::update_post_meta', + 'update_callback' => 'SP_REST_API::update_post_meta_arrays_multi', 'schema' => array( 'description' => __( 'Box Score', 'sportspress' ), 'type' => 'array', @@ -341,7 +357,7 @@ class SP_REST_API { 'metrics', array( 'get_callback' => 'SP_REST_API::get_post_data', - 'update_callback' => 'SP_REST_API::update_post_meta', + 'update_callback' => 'SP_REST_API::update_post_meta_array', 'schema' => array( 'description' => __( 'Metrics', 'sportspress' ), 'type' => 'array', @@ -357,7 +373,7 @@ class SP_REST_API { 'statistics', array( 'get_callback' => 'SP_REST_API::get_post_data', - 'update_callback' => 'SP_REST_API::update_post_meta', + 'update_callback' => 'SP_REST_API::update_post_meta_arrays_multi', 'schema' => array( 'description' => __( 'Statistics', 'sportspress' ), 'type' => 'array', @@ -401,13 +417,102 @@ class SP_REST_API { * @return bool|int */ public static function update_post_meta( $value, $object, $field_name ) { - if ( ! $value || ! is_string( $value ) ) { - return; - } - return update_post_meta( $object->ID, self::meta_key( $field_name ), strip_tags( $value ) ); } + /** + * Handler for updating array values by merging with the existing array. + * + * @param mixed $value The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * + * @return bool|int + */ + public static function update_post_meta_array( $value, $object, $field_name ) { + if ( ! is_array( $value ) ) return false; + + $type = $object->post_type; + + $meta = get_post_meta( $object->ID, self::meta_key( $field_name, $type ), true ); + + if ( ! is_array( $meta ) ) $meta = array(); + + $meta = array_merge( $meta, $value ); + + return update_post_meta( $object->ID, self::meta_key( $field_name, $type ), $meta ); + } + + /** + * Handler for updating array values by merging with the existing multidimentional array. + * + * @param mixed $value The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * + * @return bool|int + */ + public static function update_post_meta_arrays( $value, $object, $field_name ) { + if ( ! is_array( $value ) ) return false; + + $type = $object->post_type; + + $meta = get_post_meta( $object->ID, self::meta_key( $field_name, $type ), true ); + + if ( ! is_array( $meta ) ) $meta = array(); + + foreach ( $value as $index => $array ) { + if ( ! is_array( $array ) ) continue; + + if ( ! isset( $meta[ $index ] ) || ! is_array( $meta[ $index ] ) ) { + $meta[ $index ] = array(); + } + + $meta[ $index ] = array_merge( $meta[ $index ], $array ); + } + + return update_post_meta( $object->ID, self::meta_key( $field_name, $type ), $meta ); + } + + /** + * Handler for updating array values by merging with existing multidimensional arrays. + * + * @param mixed $value The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * + * @return bool|int + */ + public static function update_post_meta_arrays_multi( $value, $object, $field_name ) { + if ( ! is_array( $value ) ) return false; + + $type = $object->post_type; + + $meta = get_post_meta( $object->ID, self::meta_key( $field_name, $type ), true ); + + if ( ! is_array( $meta ) ) $meta = array(); + + foreach ( $value as $key => $arrays ) { + if ( ! is_array( $arrays ) ) continue; + + if ( ! isset( $meta[ $key ] ) || ! is_array( $meta[ $key ] ) ) { + $meta[ $key ] = array(); + } + + foreach ( $arrays as $index => $array ) { + if ( ! is_array( $array ) ) continue; + + if ( ! isset( $meta[ $key ][ $index ] ) || ! is_array( $meta[ $key ][ $index ] ) ) { + $meta[ $key ][ $index ] = array(); + } + + $meta[ $key ][ $index ] = array_merge( $meta[ $key ][ $index ], $array ); + } + } + + return update_post_meta( $object->ID, self::meta_key( $field_name, $type ), $meta ); + } + /** * Get an array of SportsPress meta field values. * @@ -526,7 +631,7 @@ class SP_REST_API { /** * Get meta key of a field */ - public static function meta_key( $field_name ) { + public static function meta_key( $field_name, $type = null ) { $names = array( 'current_teams' => 'sp_current_team', 'events' => 'sp_event', @@ -534,10 +639,24 @@ class SP_REST_API { 'past_teams' => 'sp_past_team', 'performance' => 'sp_players', 'players' => 'sp_player', + 'table' => 'sp_teams', 'tables' => 'sp_table', 'teams' => 'sp_team', ); + if ( isset( $type ) ) { + switch ( $type ) { + case 'sp_table': + $names['data'] = 'sp_teams'; + break; + case 'sp_list': + $names['data'] = 'sp_players'; + break; + } + } + + $names = apply_filters( 'sportspress_rest_meta_keys', $names, $type ); + if ( array_key_exists( $field_name, $names ) ) { $field_name = $names[ $field_name ]; } else {