Last active
October 17, 2024 11:09
-
-
Save vollyimnetz/d694276674f3d38fcbecbfa34a2750be to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Class EoEventsRestAPI | |
| * @version 1.0.0 | |
| * @see https://gist.github.com/vollyimnetz/d694276674f3d38fcbecbfa34a2750be | |
| * | |
| * This class is responsible for registering the REST API endpoint for the events | |
| * and handling the request. | |
| * The endpoint is registered under /wp-json/eo/v1/events | |
| * The endpoint accepts the following parameters: | |
| * - limit: The number of events to return | |
| * - event_end_after: The date after which the events should end | |
| * The endpoint returns an array of events. | |
| */ | |
| class EoEventsRestAPI { | |
| public static function init() { | |
| add_action( 'rest_api_init', [ __CLASS__, 'register_rest' ] ); | |
| } | |
| public static function register_rest() { | |
| register_rest_route( 'eo/v1', '/events', [ | |
| 'methods' => 'GET', | |
| 'callback' => [ __CLASS__, 'search_event' ], | |
| 'args' => [ | |
| 'limit' => [ 'validate_callback' => function( $param, $request, $key ) { return is_numeric( $param ); } ], | |
| 'event_end_after' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); }, 'default' => 'today' ], | |
| 'search' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); } ], | |
| 'category' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); } ], | |
| 'categoryIds' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); } ], | |
| 'tag' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); } ], | |
| 'tagIds' => [ 'validate_callback' => function( $param, $request, $key ) { return is_string( $param ); } ], | |
| ], | |
| 'permission_callback' => '__return_true', | |
| ] ); | |
| } | |
| public static function search_event( $request ) { | |
| try { | |
| $available_params = [ 'limit', 'event_end_after', 'search', 'category', 'categoryIds', 'tag', 'tagIds' ]; | |
| $result = []; | |
| $queryArgs = []; | |
| foreach( $available_params as $param ) { | |
| $tmp = $request->get_param( $param ); | |
| switch( $param ) { | |
| case 'limit': | |
| $queryArgs[ 'posts_per_page' ] = intval( $tmp ); | |
| break; | |
| case 'event_end_after': | |
| if(empty($tmp)) $tmp = 'today'; | |
| $queryArgs[ 'event_end_after' ] = $tmp; | |
| break; | |
| case 'search': | |
| if(!empty($tmp)) $queryArgs[ 's' ] = $tmp; | |
| break; | |
| case 'category': | |
| if(!empty($tmp)) $queryArgs[ 'tax_query' ] = [ | |
| [ | |
| 'taxonomy' => 'event-category', | |
| 'field' => 'name', | |
| 'terms' => explode(',', $tmp), | |
| ] | |
| ]; | |
| break; | |
| case 'categoryIds': | |
| if(!empty($tmp)) $queryArgs[ 'tax_query' ] = [ | |
| [ | |
| 'taxonomy' => 'event-category', | |
| 'field' => 'term_id', | |
| 'terms' => explode(',', $tmp), | |
| ] | |
| ]; | |
| break; | |
| case 'tag': | |
| if(!empty($tmp)) $queryArgs[ 'tax_query' ] = [ | |
| [ | |
| 'taxonomy' => 'event-tag', | |
| 'field' => 'name', | |
| 'terms' => explode(',', $tmp), | |
| ] | |
| ]; | |
| break; | |
| case 'tagIds': | |
| if(!empty($tmp)) $queryArgs[ 'tax_query' ] = [ | |
| [ | |
| 'taxonomy' => 'event-tag', | |
| 'field' => 'term_id', | |
| 'terms' => explode(',', $tmp), | |
| ] | |
| ]; | |
| break; | |
| } | |
| } | |
| // possibliity to modify the query args | |
| $queryArgs = apply_filters( 'eo_events_rest_api_query', $queryArgs, $request ); | |
| $events = eo_get_events( $queryArgs ); | |
| if ( $events ) { | |
| foreach ( $events as $event ) { | |
| $venue_id = eo_get_venue( $event->ID ); | |
| $venue_name = eo_get_venue_name( $venue_id ); | |
| $result[] = self::enrichEventData($event); | |
| } | |
| } | |
| error_log(print_r($queryArgs, true)); | |
| return $result; | |
| } catch ( Exception $e ) { | |
| return new WP_Error( 'error', $e->getMessage(), [ 'status' => 423 ] ); | |
| } | |
| } | |
| public static function enrichEventData($event) { | |
| $thumbnailSize = apply_filters( 'eo_events_rest_api_thumbnail_size', 'thumbnail' ); | |
| //fix native data format | |
| $event->event_title = $event->post_title; | |
| $event->event_startDate = $event->StartDate; | |
| $event->event_startTime = $event->StartTime; | |
| $event->event_endDate = $event->EndDate; | |
| $event->event_endTime = $event->FinishTime; | |
| $event->event_id = intval($event->event_id); | |
| $event->event_occurrence = intval($event->event_occurrence); | |
| $event->event_occurrence_id = intval($event->occurrence_id); | |
| $event->event_link = get_permalink($event->ID); | |
| $event->event_tax = wp_get_post_terms($event->ID, 'event-tag'); | |
| $event->event_category = wp_get_post_terms($event->ID, 'event-category'); | |
| $event->event_moreThanOneDay = eo_get_the_start('d.m.Y', $event->ID, $event->occurrence_id) !== eo_get_the_end('d.m.Y', $event->ID, $event->occurrence_id); | |
| $event->event_allDay = eo_is_all_day($event->ID); | |
| $event->event_thumbnail = get_the_post_thumbnail_url($event->ID, $thumbnailSize); | |
| $event->event_thumbnail_data = wp_get_attachment_image_src(get_post_thumbnail_id($event->ID), $thumbnailSize); | |
| $event->event_thumbnailId = get_post_thumbnail_id($event->ID); | |
| $venue_id = eo_get_venue( $event->ID ); | |
| $latLng = eo_get_venue_latlng( $venue_id ); | |
| $event->event_venue = (object)eo_get_venue_address($venue_id); | |
| $event->event_venue->id = $venue_id; | |
| $event->event_venue->name = eo_get_venue_name( $venue_id ); | |
| if(!empty($latLng)) { | |
| $event->event_venue->latitude = floatval($latLng['lat']); | |
| $event->event_venue->longitude = floatval($latLng['lng']); | |
| } | |
| return apply_filters( 'eo_events_rest_api_enrich_event_data', $event); | |
| } | |
| } | |
| EoEventsRestAPI::init(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment