From 75202319c0da34654c516f73f8c6bea128e989d2 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Fri, 21 Jul 2017 00:58:21 +0200 Subject: [PATCH] Events: Add API Sort by event start time. Supports param future=1 which limits events to future ones. Also removes unused short code. --- README.md | 1 + .../neuf-events/neuf-events-post-types.php | 100 ++++++++++-------- plugins/neuf-events/neuf-events.php | 7 +- 3 files changed, 58 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 52e6324a..c0760242 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ # own neuf-associations neuf-events + wpdirauth-posixgroup ## Development tasks fab build diff --git a/plugins/neuf-events/neuf-events-post-types.php b/plugins/neuf-events/neuf-events-post-types.php index 208a321b..3139b89f 100644 --- a/plugins/neuf-events/neuf-events-post-types.php +++ b/plugins/neuf-events/neuf-events-post-types.php @@ -44,12 +44,15 @@ function neuf_events_post_type() { 'rewrite' => array( 'slug' => __( 'event', 'neuf_event' ), ), + 'show_in_rest' => true, + 'rest_base' => 'events', + 'rest_controller_class' => 'WP_REST_Posts_Controller', ) ); } -/* When the post is saved, save our custom data */ +/* When the post is saved, save our custom data */ function neuf_events_save_post( $post_id, $post ) { // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times @@ -115,53 +118,62 @@ function neuf_events_the_post( &$post ) { } -/** Sample table view of events */ -function neuf_events_program() { - global $post, $wp_locale; - $events = new WP_Query( array( - 'post_type' => 'event', - 'posts_per_page' => -1, - 'meta_key' => '_neuf_events_starttime', - 'orderby' => 'meta_value', - 'order' => 'ASC' - ) ); +/** API: Add our custom fields to the events endpoint */ +add_filter('rest_prepare_event', 'api_add_custom_fields', 10, 3); +function api_add_custom_fields($response, $post, $request) { + $custom_field_data = get_post_custom($post->ID); + $field_map = array( + '_neuf_events_venue' => 'venue', + '_neuf_events_fb_url' => 'facebook_url', + '_neuf_events_bs_url' => 'ticket_url', + '_neuf_events_price_regular' => 'price_regular', + '_neuf_events_price_member' => 'price_member', + '_neuf_events_starttime' => 'start_time', + '_neuf_events_endtime' => 'end_time' - if ( $events->have_posts() ) : - $date = ""; - ob_start(); - echo ''; + ); + foreach ($field_map as $src => $dst) { + $response->data[$dst] = $custom_field_data[$src][0]; + } - while ( $events->have_posts() ) : $events->the_post(); - $venue = get_post_meta( $post->ID, '_neuf_events_venue', true); - $price_regular = get_post_meta( $post->ID, '_neuf_events_price_regular', true); - $price_member = get_post_meta( $post->ID, '_neuf_events_price_member', true); - $time = get_post_meta( $post->ID, '_neuf_events_starttime', true); - ?> - - - - - - - data['end_time'] ) { + // No endtime? Assume 2 hours + $response->data['end_time'] = $response->data['start_time'] + 7200; + } + $response->data['start_time'] = date("c", $response->data['start_time'] - $offset_in_seconds); + $response->data['end_time'] = date("c", $response->data['end_time'] - $offset_in_seconds); - echo '
- - - kl - - - - -
'; - endif; - - $html = ob_get_contents(); - ob_end_clean(); - return $html; + return $response; } -?> +/** API: Order by start time */ +add_filter('rest_event_query', 'api_change_query', 10, 2); +function api_change_query($args, $request) { + $start_time_field = '_neuf_events_starttime'; + $sligthly_in_the_past = date('U', strtotime('-8 hours')); + + /* Order by start time */ + $my_args = array( + 'posts_per_page' => 300, + 'orderby' => 'meta_value_num', + 'meta_key' => $start_time_field, + 'order' => 'ASC', + 'ignore_sticky_posts' => true + ); + + /* Only show future events? */ + $params = $request->get_params(); + $future = $params['future'] ?? null; + if( $future ) { + $my_args['meta_query'] = array( + 'key' => $start_time_field, + 'value' => $sligthly_in_the_past, + 'compare' => '>', + 'type' => 'numeric' + ); + } + return array_merge($args, $my_args); +} \ No newline at end of file diff --git a/plugins/neuf-events/neuf-events.php b/plugins/neuf-events/neuf-events.php index 72200cdf..b3a63717 100644 --- a/plugins/neuf-events/neuf-events.php +++ b/plugins/neuf-events/neuf-events.php @@ -28,12 +28,10 @@ add_action( 'the_post' , 'neuf_events_the_post' ); /* Register taxonomies */ add_action( 'init' , 'neuf_events_register_taxonomies', 1 ); -/* Register shortcode for sample table view of program. */ -add_shortcode( 'neuf-events-program' , 'neuf_events_program' ); - function neuf_events_i18n() { load_plugin_textdomain( 'neuf_event', false, dirname( plugin_basename( __FILE__ ) ) .'/languages' ); } + /* JSON API controller */ function add_events_controller($controllers) { $controllers[] = 'events'; @@ -45,6 +43,3 @@ function set_events_controller_path() { return WP_PLUGIN_DIR."/".dirname( plugin_basename( __FILE__ ))."/neuf-events-json-controller.php"; } add_filter('json_api_events_controller_path', 'set_events_controller_path'); - - -?>