Tribe__Events__Pro__Main::detect_recurrence_redirect()
At the pre_get_post hook detect if we should redirect to a particular instance for an invalid 404 recurrence entries.
Return
(mixed)
Source
File: src/Tribe/Main.php
public function detect_recurrence_redirect() {
global $wp;
$wp_query = tribe_get_global_query_object();
if ( is_null( $wp_query ) || ! isset( $wp_query->query_vars['eventDisplay'] ) ) {
return false;
}
$current_url = null;
$problem = _x( 'Unknown', 'debug recurrence', 'tribe-events-calendar-pro' );
switch ( $wp_query->query_vars['eventDisplay'] ) {
case 'single-event':
// a recurrence event with a bad date will throw 404 because of WP_Query limiting by date range
if ( is_404() || empty( $wp_query->query['eventDate'] ) ) {
$recurrence_check = array_merge( array( 'posts_per_page' => 1 ), $wp_query->query );
unset( $recurrence_check['eventDate'] );
unset( $recurrence_check['tribe_events'] );
// retrieve event object
$get_recurrence_event = new WP_Query( $recurrence_check );
// if a reccurence event actually exists then proceed with redirection
if (
! empty( $get_recurrence_event->posts )
&& tribe_is_recurring_event( $get_recurrence_event->posts[0]->ID )
&& 'publish' === get_post_status( $get_recurrence_event->posts[0] )
) {
$problem = _x( 'invalid date', 'debug recurrence', 'tribe-events-calendar-pro' )
. empty( $wp_query->query['eventDate'] ) ? '' : ': ' . $wp_query->query['eventDate'];
$current_url = Tribe__Events__Main::instance()->getLink( 'all', $get_recurrence_event->posts[0]->ID );
}
break;
}
// We are receiving the event date
if ( ! empty( $wp_query->query['eventDate'] ) ) {
$event_id = get_the_id();
// if is a recurring event
if ( tribe_is_recurring_event( $event_id ) ) {
$event = get_post( $event_id );
// if no post parent (ether the post parent or inexistent)
if ( ! $event->post_parent ) {
// get all the recursive event dates
$dates = tribe_get_recurrence_start_dates( $event_id );
$exist = false;
foreach ( $dates as $date ) {
// check if the date exists in any of the recurring event set
if ( 0 === strpos( $date, $wp_query->query['eventDate'] ) ) {
$exist = true;
break;
}
}
// if the event date coming on the URL doesn't exist, display the /all/ page
if ( ! $exist ) {
$problem = _x( 'incorrect slug', 'debug recurrence', 'tribe-events-calendar-pro' );
$current_url = Tribe__Events__Main::instance()->getLink( 'all', $event_id );
break;
}
}
}
}
// A child event should be using its parent's slug. If it's using its own, redirect.
if ( tribe_is_recurring_event( get_the_ID() ) && '' !== get_option( 'permalink_structure' ) ) {
$event = get_post( get_the_ID() );
if ( ! empty( $event->post_parent ) ) {
if ( isset( $wp_query->query['name'] ) && $wp_query->query['name'] == $event->post_name ) {
$problem = _x( 'incorrect slug', 'debug recurrence', 'tribe-events-calendar-pro' );
$current_url = get_permalink( $event->ID );
}
}
}
break;
}
/**
* Provides an opportunity to modify the redirection URL prior to the actual redirection.
*
* @param string $current_url
*/
$current_url = apply_filters( 'tribe_events_pro_recurrence_redirect_url', $current_url );
if ( ! empty( $current_url ) ) {
// redirect user with 301
$confirm_redirect = apply_filters( 'tribe_events_pro_detect_recurrence_redirect', true, $wp_query->query_vars['eventDisplay'] );
do_action( 'tribe_events_pro_detect_recurrence_redirect', $wp_query->query_vars['eventDisplay'] );
if ( $confirm_redirect ) {
tribe( 'logger' )->log_warning( sprintf(
_x( 'Invalid instance of a recurring event was requested ($1%s) redirecting to $2%s', 'debug recurrence', 'tribe-events-calendar-pro' ),
$problem,
$current_url
),
__METHOD__
);
wp_safe_redirect( $current_url, 301 );
exit;
}
}
}