Skip to content

Commit

Permalink
TMS-968: Add recurring event fields to manual events (#20)
Browse files Browse the repository at this point in the history
* TMS-968: Add recurring event fields to manual events

* TMS-968: Remove todo-comment

* TMS-968: Filter empty items from event-array, fix dates for past event single-page

* TMS-968: phpcs fixes

* TMS-968: Fix recurring manual-event date comparisons

* TMS-968: Fix combined-events-search error

* TMS-968: Event query fixes

* TMS-968: phpcs fixes

* 1.3.0
  • Loading branch information
eebbi authored Mar 26, 2024
1 parent b59992a commit 9888f3a
Show file tree
Hide file tree
Showing 6 changed files with 280 additions and 5 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning][semver].

## [Unreleased]

## [1.3.0] - 2024-03-26

- TMS-968:
- Add recurring event fields to manual events
- Add recurring event logic to events component, combined event search & combined event listing

## [1.2.0] - 2024-02-01

- TMS-977: Add combined events search page-template.
Expand Down
2 changes: 1 addition & 1 deletion plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Plugin Name: TMS Manual Events
* Plugin URI: https://github.com/devgeniem/tms-plugin-manual-events
* Description: TMS Manual Events
* Version: 1.2.0
* Version: 1.3.0
* Requires PHP: 7.4
* Author: Geniem Oy
* Author URI: https://geniem.com
Expand Down
64 changes: 62 additions & 2 deletions src/Models/page-combined-events-list.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,11 @@ protected function get_events() : array {

if ( empty( $response ) ) {
$response = $this->do_get_events( $params );
$response['events'] = array_merge( $response['events'], $this->get_manual_events() );
$response['events'] = array_merge(
$response['events'],
$this->get_manual_events(),
$this->get_recurring_manual_events()
);

// Sort events by start datetime objects.
usort( $response['events'], function( $a, $b ) {
Expand Down Expand Up @@ -133,16 +137,21 @@ protected function get_manual_events() : array {
'post_type' => PostType\ManualEvent::SLUG,
'posts_per_page' => 200, // phpcs:ignore
'meta_query' => [
'relation' => 'AND',
[
'key' => 'end_datetime',
'value' => date( 'Y-m-d' ),
'compare' => '>=',
'type' => 'DATE',
],
[
'key' => 'recurring_event',
'value' => 0,
],
],
];

$query = new WP_Query( $args );
$query = new \WP_Query( $args );

if ( empty( $query->posts ) ) {
return [];
Expand All @@ -161,4 +170,55 @@ protected function get_manual_events() : array {

return $events;
}

/**
* Get recurring manual events.
*
* @return array
*/
protected function get_recurring_manual_events() : array {
$args = [
'post_type' => PostType\ManualEvent::SLUG,
'posts_per_page' => 200, // phpcs:ignore
'meta_query' => [
[
'key' => 'recurring_event',
'value' => 1,
],
],
];

$query = new \WP_Query( $args );

if ( empty( $query->posts ) ) {
return [];
}

// Loop through events
$recurring_events = array_map( function ( $e ) {
$id = $e->ID;
$event = (object) \get_fields( $id );
$time_now = \current_datetime();
$timezone = new DateTimeZone( 'Europe/Helsinki' );

foreach ( $event->dates as $date ) {
$event_start = new DateTime( $date['start'], $timezone );
$event_end = new DateTime( $date['end'], $timezone );

// Return only ongoing or next upcoming event
if ( ( $time_now > $event_start && $time_now < $event_end ) || $time_now < $event_start ) {
$event->id = $id;
$event->title = \get_the_title( $id );
$event->url = \get_permalink( $id );
$event->image = \has_post_thumbnail( $id ) ? \get_the_post_thumbnail_url( $id, 'medium_large' ) : null; // phpcs:ignore
$event->start_datetime = $date['start'];
$event->end_datetime = $date['end'];

return PostType\ManualEvent::normalize_event( $event );
}
}
}, $query->posts );

return array_filter( $recurring_events );
}
}
86 changes: 84 additions & 2 deletions src/Models/page-combined-events-search.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ protected function get_events() : array {
$end_date = \get_query_var( self::EVENT_SEARCH_END_DATE );
$end_date = ! empty( $end_date ) ? $end_date : date( 'Y-m-d', strtotime( '+1 year' ) );

if ( ! $event_search_text && ! \get_query_var( self::EVENT_SEARCH_START_DATE ) && ! \get_query_var( self::EVENT_SEARCH_END_DATE ) ) {
if ( ! $event_search_text && ! \get_query_var( self::EVENT_SEARCH_START_DATE ) && ! \get_query_var( self::EVENT_SEARCH_END_DATE ) ) { // phpcs:ignore
return [];
}

Expand Down Expand Up @@ -151,7 +151,11 @@ protected function get_events() : array {

if ( empty( $response ) ) {
$response = $this->do_get_events( $params );
$response['events'] = array_merge( $response['events'] ?? [], $this->get_manual_events( $params ) );
$response['events'] = array_merge(
$response['events'] ?? [],
$this->get_manual_events( $params ),
$this->get_recurring_manual_events( $params )
);

// Sort events by start datetime objects.
usort( $response['events'], function( $a, $b ) {
Expand Down Expand Up @@ -184,6 +188,7 @@ protected function get_manual_events( $params ) : array {
'posts_per_page' => 200, // phpcs:ignore
's' => $params['q'] ?? '',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'end_datetime',
'value' => [
Expand All @@ -193,6 +198,10 @@ protected function get_manual_events( $params ) : array {
'compare' => 'BETWEEN',
'type' => 'DATE',
],
[
'key' => 'recurring_event',
'value' => 0,
],
],
];

Expand Down Expand Up @@ -235,4 +244,77 @@ protected function get_manual_events( $params ) : array {

return $events;
}


/**
* Get recurring manual events.
*
* @param array $params Query parameters.
*
* @return array
*/
protected function get_recurring_manual_events( $params ) : array {
$args = [
'post_type' => PostType\ManualEvent::SLUG,
'posts_per_page' => 200, // phpcs:ignore
's' => $params['q'] ?? '',
'meta_query' => [
[
'key' => 'recurring_event',
'value' => 1,
],
],
];

$query = new \WP_Query( $args );

if ( empty( $query->posts ) ) {
return [];
}

// Loop through events
$recurring_events = array_map( function ( $e ) use ( $params ) {
$id = $e->ID;
$event = (object) \get_fields( $id );
$event->id = $id;
$event->title = \get_the_title( $id );
$event->url = \get_permalink( $id );
$event->image = \has_post_thumbnail( $id ) ? \get_the_post_thumbnail_url( $id, 'medium_large' ) : null;
$timezone = new DateTimeZone( 'Europe/Helsinki' );
$time_now = new DateTime( 'now', $timezone );

foreach ( $event->dates as $date ) {
$event_start = new DateTime( $date['start'], $timezone );
$event_end = new DateTime( $date['end'], $timezone );

// Check if url-parameters exist
if ( ! \get_query_var( self::EVENT_SEARCH_START_DATE ) && ! \get_query_var( self::EVENT_SEARCH_END_DATE ) ) { // phpcs:ignore
// Return only ongoing or next upcoming event
if ( $time_now > $event_start && $time_now < $event_end ) {
$event->start_datetime = $date['start'];
$event->end_datetime = $date['end'];
}
}
elseif ( \get_query_var( self::EVENT_SEARCH_START_DATE ) ) {
$param_start = new DateTime(
\get_query_var( self::EVENT_SEARCH_START_DATE ),
new \DateTimeZone( 'Europe/Helsinki' )
);

// Get next starting event
if ( $param_start <= $event_start ) {
$event->start_datetime = $date['start'];
$event->end_datetime = $date['end'];
}
}

// Return recurring event if date is set
if ( ! empty( $event->start_datetime ) ) {
return PostType\ManualEvent::normalize_event( $event );
}
}
}, $query->posts );

return array_filter( $recurring_events );
}
}
25 changes: 25 additions & 0 deletions src/Models/single-manual-event-cpt.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,31 @@ public function event() {
return null;
}

// Change dates if recurring event
if ( $event->recurring_event ) {
$time_now = \current_datetime();
$timezone = new DateTimeZone( 'Europe/Helsinki' );

foreach ( $event->dates as $date ) {
$event_start = new DateTime( $date['start'], $timezone );
$event_end = new DateTime( $date['end'], $timezone );

// Return only ongoing or next upcoming event
if ( ( $time_now > $event_start && $time_now < $event_end ) || $time_now < $event_start ) {
$event->start_datetime = $date['start'];
$event->end_datetime = $date['end'];
break;
}
}

// Set latest dates if no upcoming date found
if ( empty( $event->start_datetime ) && empty( $event->end_datetime ) ) {
$last_dates = end( $event->dates );
$event->start_datetime = $last_dates['start'];
$event->end_datetime = $last_dates['end'];
}
}

return [
'normalized' => ManualEvent::normalize_event( $event ),
'orig' => $event,
Expand Down
Loading

0 comments on commit 9888f3a

Please sign in to comment.