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; } } }