Tribe__Events__Repositories__Event::filter_by_date_overlaps( string|DateTime|int $start_datetime, string|DateTime|int $end_datetime, string|DateTimeZone $timezone = null, null|int $min_sec_overlap = 1 )

Filters events whose duration overlaps a given Start and End date; fetch is inclusive Will include multi-day events.


Parameters

$start_datetime

(string|DateTime|int) (Required) A strtotime parse-able string, a DateTime object or a timestamp.

$end_datetime

(string|DateTime|int) (Required) A strtotime parse-able string, a DateTime object or a timestamp.

$timezone

(string|DateTimeZone) (Optional) A timezone string, UTC offset or DateTimeZone object; defaults to the site timezone; this parameter is ignored if the $datetime parameter is a DatTime object.

Default value: null

$min_sec_overlap

(null|int) (Optional) The minimum overlap, in seconds, an event should have with the interval; defaults to at least a second.

Default value: 1


Top ↑

Source

File: src/Tribe/Repositories/Event.php

	public function filter_by_date_overlaps( $start_datetime, $end_datetime, $timezone = null ) {
		global $wpdb;
		$utc = $this->normal_timezone;

		$lower = Tribe__Date_Utils::build_date_object( $start_datetime, $timezone )->setTimezone( $utc );
		$upper = Tribe__Date_Utils::build_date_object( $end_datetime, $timezone )->setTimezone( $utc );
		$lower_string = $lower->format( Tribe__Date_Utils::DBDATETIMEFORMAT );
		$upper_string = $upper->format( Tribe__Date_Utils::DBDATETIMEFORMAT );
		$start_key = $this->start_meta_key;
		$end_key = $this->end_meta_key;

		$join_start_key = 'tribe_start_date_utc';
		$join_end_key = 'tribe_end_date_utc';

		$this->filter_query->join(
			"LEFT JOIN {$wpdb->postmeta} {$join_start_key}
			ON ( {$wpdb->posts}.ID = {$join_start_key}.post_id
			AND {$join_start_key}.meta_key = '{$start_key}' )"
		);

		$this->filter_query->join(
			"LEFT JOIN {$wpdb->postmeta} {$join_end_key}
			ON ( {$wpdb->posts}.ID = {$join_end_key}.post_id
			AND {$join_end_key}.meta_key = '{$end_key}' )"
		);

		$this->filter_query->where(
			"
			(
				CAST({$join_start_key}.meta_value AS DATETIME) >= '{$lower_string}'
				AND CAST({$join_start_key}.meta_value AS DATETIME) <= '{$upper_string}'
			) OR (
				CAST({$join_end_key}.meta_value AS DATETIME) >= '{$lower_string}'
				AND CAST({$join_start_key}.meta_value AS DATETIME) <= '{$upper_string}'
			) OR (
				CAST({$join_start_key}.meta_value AS DATETIME) < '{$lower_string}'
				AND CAST({$join_end_key}.meta_value AS DATETIME) >= '{$upper_string}'
			)
			"
		);

	}

Top ↑

Changelog

Changelog
Version Description
4.9.11 Add the $min_sec_overlap parameter.
4.9 Introduced.