Skip to content

Instantly share code, notes, and snippets.

@vollyimnetz
Last active October 17, 2024 11:09
Show Gist options
  • Select an option

  • Save vollyimnetz/d694276674f3d38fcbecbfa34a2750be to your computer and use it in GitHub Desktop.

Select an option

Save vollyimnetz/d694276674f3d38fcbecbfa34a2750be to your computer and use it in GitHub Desktop.
<?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