Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TMS-968: Add recurring event fields to manual events #20

Merged
merged 9 commits into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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'] ?? '',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
's' => $params['q'] ?? '',
's' => ! empty( $params['q'] ) ? $params['q'] : '',

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'??' operaattori tekee saman, eli käyttää ensimmäistä parametriä jos se on olemassa & ei ole null

'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
Loading