/** * Is hooked by init() filter to parse the WP_Query arguments for main and alt queries. * * @param object $query WP_Query object args supplied or default * @return object $query (modified) */ public function pre_get_posts($query) { global $wp_the_query; $types = !empty($query->query_vars['post_type']) ? (array) $query->query_vars['post_type'] : array(); // is the query pulling posts from the past $query->tribe_is_past = !empty($query->query_vars['tribe_is_past']) ? $query->query_vars['tribe_is_past'] : false; // check if any possiblity of this being an event query $query->tribe_is_event = in_array(TribeEvents::POSTTYPE, $types) ? true : false; // check if any possiblity of this being an event category $query->tribe_is_event_category = isset($query->query_vars[TribeEvents::TAXONOMY]) && $query->query_vars[TribeEvents::TAXONOMY] != '' ? true : false; $query->tribe_is_event_venue = in_array(TribeEvents::VENUE_POST_TYPE, $types) ? true : false; $query->tribe_is_event_organizer = in_array(TribeEvents::ORGANIZER_POST_TYPE, $types) ? true : false; $query->tribe_is_event_query = $query->tribe_is_event || $query->tribe_is_event_category || $query->tribe_is_event_venue || $query->tribe_is_event_organizer ? true : false; // move along, this is not the query you are looking for // setup static const to preserve query type through hooks self::$is_event = $query->tribe_is_event; self::$is_event_category = $query->tribe_is_event_category; self::$is_event_venue = $query->tribe_is_event_venue; self::$is_event_organizer = $query->tribe_is_event_organizer; self::$is_event_query = $query->tribe_is_event_query; if ($query === $wp_the_query && $query->is_main_query() && tribe_get_option('showEventsInMainLoop', false) && !is_page() && !is_admin() && !is_single() && !is_singular() && (is_home() && !$query->tribe_is_event_query || is_archive() || is_category() || is_tax())) { $query->query_vars['post_type'] = isset($query->query_vars['post_type']) ? (array) $query->query_vars['post_type'] : array('post'); $query->query_vars['post_type'][] = TribeEvents::POSTTYPE; } if ($query->tribe_is_event || $query->tribe_is_event_category) { self::$start_date = null; self::$end_date = null; add_filter('posts_join', array(__CLASS__, 'posts_join'), 10, 2); add_filter('posts_join', array(__CLASS__, 'posts_join_orderby'), 10, 2); add_filter('posts_where', array(__CLASS__, 'posts_where'), 10, 2); add_filter('posts_fields', array(__CLASS__, 'posts_fields'), 10, 2); add_filter('posts_distinct', array(__CLASS__, 'posts_distinct')); add_filter('posts_groupby', array(__CLASS__, 'posts_groupby'), 10, 2); // if a user selects a date in the event bar we want it to persist as long as possible if (!empty($_REQUEST['tribe-bar-date'])) { $query->set('eventDate', $_REQUEST['tribe-bar-date']); } // if a user provides a search term we want to use that in the search params if (!empty($_REQUEST['tribe-bar-search'])) { $query->query_vars['s'] = $_REQUEST['tribe-bar-search']; } $query->query_vars['eventDisplay'] = !empty($query->query_vars['eventDisplay']) ? $query->query_vars['eventDisplay'] : TribeEvents::instance()->displaying; if (!empty($query->query_vars['eventDisplay'])) { switch ($query->query_vars['eventDisplay']) { case 'custom': // if set this allows for a custom query to not be burdened with these settings break; case 'past': // setup past event display query $query->set('end_date', date_i18n(TribeDateUtils::DBDATETIMEFORMAT)); $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order('DESC')); self::$end_date = $query->get('end_date'); $query->tribe_is_past = true; break; case 'all': $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); break; case 'month': $start_date = substr_replace(date_i18n(TribeDateUtils::DBDATEFORMAT), '01', -2); $passed_date = $query->get('eventDate') ? substr_replace(date_i18n(TribeDateUtils::DBDATEFORMAT, strtotime($query->get('eventDate'))), '01', -2) : false; $start_date = $passed_date ? $passed_date : $start_date; $query->set('start_date', $start_date); $query->set('eventDate', $start_date); $query->set('end_date', date('Y-m-d', strtotime(TribeEvents::instance()->nextMonth($start_date)) - 24 * 3600)); if ($query->is_main_query()) { $query->set('posts_per_page', 1); // we're going to do this day-by-day later, so limit or order necessary for this $query->set('no_found_rows', TRUE); } else { $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); $query->set('posts_per_page', -1); // get all events for the month } self::$start_date = $query->get('start_date'); self::$end_date = $query->get('end_date'); break; case 'single-event': if ($query->get('eventDate') != '') { $query->set('start_date', $query->get('eventDate')); $query->set('eventDate', $query->get('eventDate')); self::$start_date = $query->get('start_date'); } break; case 'upcoming': default: // default display query $start_date = date_i18n(TribeDateUtils::DBDATETIMEFORMAT); $start_date = $query->get('eventDate') != '' ? $query->get('eventDate') : $start_date; $query->set('hide_upcoming', true); $query->set('start_date', $start_date); $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); self::$start_date = $query->get('start_date'); break; } } else { $query->set('hide_upcoming', true); $query->set('start_date', date_i18n(TribeDateUtils::DBDATETIMEFORMAT)); $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); self::$start_date = $query->get('start_date'); } // eventCat becomes a standard taxonomy query - will need to deprecate and update views eventually if (!in_array($query->get(TribeEvents::TAXONOMY), array('', '-1'))) { $tax_query[] = array('taxonomy' => TribeEvents::TAXONOMY, 'field' => is_numeric($query->get(TribeEvents::TAXONOMY)) ? 'id' : 'slug', 'terms' => $query->get(TribeEvents::TAXONOMY), 'include_children' => false); } $meta_query[] = array('key' => '_EventStartDate', 'type' => 'DATETIME'); } // filter by Venue ID if ($query->tribe_is_event_query && $query->get('venue') != '') { $meta_query[] = array('key' => '_EventVenueID', 'value' => $query->get('venue')); } // filter by Organizer ID if ($query->tribe_is_event_query && $query->get('organizer') != '') { $meta_query[] = array('key' => '_EventOrganizerID', 'value' => $query->get('organizer')); } // proprietary metaKeys go to standard meta if ($query->tribe_is_event_query && $query->get('metaKey') != '') { $meta_query[] = array('key' => $query->get('metaKey'), 'value' => $query->get('metaValue')); } // enable pagination setup if ($query->tribe_is_event_query && $query->get('numResults') != '') { $query->set('posts_per_page', $query->get('numResults')); } elseif ($query->tribe_is_event_query && $query->get('posts_per_page') == '') { $query->set('posts_per_page', (int) tribe_get_option('postsPerPage', 10)); } // hide upcoming events from query (only not in admin) if ($query->tribe_is_event_query && $query->get('hide_upcoming')) { $hide_upcoming_ids = self::getHideFromUpcomingEvents(); if (!empty($hide_upcoming_ids)) { $query->set('post__not_in', $hide_upcoming_ids); } } if ($query->tribe_is_event_query && !empty($meta_query)) { // setup default relation for meta queries $meta_query['relation'] = 'AND'; $meta_query_combined = array_merge((array) $meta_query, (array) $query->get('meta_query')); $query->set('meta_query', $meta_query_combined); } if ($query->tribe_is_event_query && !empty($tax_query)) { // setup default relation for tax queries $tax_query_combined = array_merge((array) $tax_query, (array) $query->get('tax_query')); $query->set('tax_query', $tax_query_combined); } if ($query->tribe_is_event_query) { add_filter('posts_orderby', array(__CLASS__, 'posts_orderby'), 10, 2); } // if is in the admin remove the event date & upcoming filters, unless is an ajax call global $current_screen; if (is_admin() && $query->tribe_is_event_query && !empty($current_screen->id) && $current_screen->id == 'edit-' . TribeEvents::POSTTYPE) { if (!defined('DOING_AJAX') || defined('DOING_AJAX') && !DOING_AJAX) { // remove_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 ); remove_filter('posts_where', array(__CLASS__, 'posts_where'), 10, 2); remove_filter('posts_fields', array(__CLASS__, 'posts_fields')); remove_filter('posts_distinct', array(__CLASS__, 'posts_distinct')); remove_filter('posts_groupby', array(__CLASS__, 'posts_groupby')); $query->set('post__not_in', ''); // set the default order for posts within admin lists if (!isset($query->query['order'])) { $query->set('order', 'DESC'); } else { // making sure we preserve the order supplied by the query string even if it is overwritten above $query->set('order', $query->query['order']); } } } // check if is_event_query === true and hook filter if ($query->tribe_is_event_query) { // fixing is_home param $query->is_home = !empty($query->query_vars['is_home']) ? $query->query_vars['is_home'] : false; apply_filters('tribe_events_pre_get_posts', $query); } return $query; }
/** * Is hooked by init() filter to parse the WP_Query arguments for main and alt queries. * * @param object $query WP_Query object args supplied or default * @return object $query (modified) */ public static function pre_get_posts($query) { // setup static const to preserve query type through hooks self::$is_event = $query->tribe_is_event; self::$is_event_category = $query->tribe_is_event_category; self::$is_event_venue = $query->tribe_is_event_venue; self::$is_event_organizer = $query->tribe_is_event_organizer; self::$is_event_query = $query->tribe_is_event_query; if ($query->is_main_query() && is_home()) { // check option for including events in the main wordpress loop, if true, add events post type if (tribe_get_option('showEventsInMainLoop', false)) { $query->query_vars['post_type'] = isset($query->query_vars['post_type']) ? (array) $query->query_vars['post_type'] : array('post'); $query->query_vars['post_type'][] = TribeEvents::POSTTYPE; $query->tribe_is_multi_posttype = true; } } if ($query->tribe_is_multi_posttype) { do_action('log', 'multi_posttype', 'default', $query->tribe_is_multi_posttype); add_filter('posts_fields', array(__CLASS__, 'multi_type_posts_fields'), 10, 2); add_filter('posts_join', array(__CLASS__, 'posts_join'), 10, 2); add_filter('posts_join', array(__CLASS__, 'posts_join_orderby'), 10, 2); add_filter('posts_distinct', array(__CLASS__, 'posts_distinct')); add_filter('posts_groupby', array(__CLASS__, 'posts_groupby'), 10, 2); add_filter('posts_orderby', array(__CLASS__, 'posts_orderby'), 10, 2); do_action('tribe_events_pre_get_posts', $query); return; } if ($query->tribe_is_event || $query->tribe_is_event_category) { self::$start_date = null; self::$end_date = null; if (!($query->is_main_query() && $query->get('eventDisplay') == 'month')) { add_filter('posts_fields', array(__CLASS__, 'posts_fields'), 10, 2); add_filter('posts_join', array(__CLASS__, 'posts_join'), 10, 2); add_filter('posts_join', array(__CLASS__, 'posts_join_orderby'), 10, 2); add_filter('posts_where', array(__CLASS__, 'posts_where'), 10, 2); add_filter('posts_distinct', array(__CLASS__, 'posts_distinct')); add_filter('posts_groupby', array(__CLASS__, 'posts_groupby'), 10, 2); } else { // reduce number of queries triggered by main WP_Query on month view $query->set('posts_per_page', 1); $query->set('no_found_rows', true); $query->set('cache_results', false); $query->set('update_post_meta_cache', false); $query->set('update_post_term_cache', false); $query->set('meta_query', array(array('key' => '_EventStartDate', 'type' => 'DATETIME'))); do_action('tribe_events_pre_get_posts', $query); return $query; } // if a user selects a date in the event bar we want it to persist as long as possible if (!empty($_REQUEST['tribe-bar-date'])) { $query->set('eventDate', $_REQUEST['tribe-bar-date']); } // if a user provides a search term we want to use that in the search params if (!empty($_REQUEST['tribe-bar-search'])) { $query->query_vars['s'] = $_REQUEST['tribe-bar-search']; } $query->query_vars['eventDisplay'] = !empty($query->query_vars['eventDisplay']) ? $query->query_vars['eventDisplay'] : TribeEvents::instance()->displaying; if (!empty($query->query_vars['eventDisplay'])) { switch ($query->query_vars['eventDisplay']) { case 'custom': // if set this allows for a custom query to not be burdened with these settings break; case 'all': $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); break; case 'single-event': if ($query->get('eventDate') != '') { $query->set('start_date', $query->get('eventDate')); $query->set('eventDate', $query->get('eventDate')); self::$start_date = $query->get('start_date'); } break; case 'upcoming': case 'past': default: // default display query $tribe_paged = !empty($_REQUEST['tribe_paged']) ? $_REQUEST['tribe_paged'] : $query->get('paged'); $query->set('paged', $tribe_paged); $event_date = $query->get('eventDate') != '' ? $query->get('eventDate') : date_i18n(TribeDateUtils::DBDATETIMEFORMAT); if (!$query->tribe_is_past) { $query->set('start_date', $event_date); $query->set('end_date', ''); $query->set('order', self::set_order()); } else { $query->set('start_date', ''); $query->set('end_date', $event_date); $query->set('order', self::set_order('DESC')); } $query->set('orderby', self::set_orderby()); $query->set('hide_upcoming', true); self::$start_date = $query->get('start_date'); self::$end_date = $query->get('end_date'); break; $query->set('eventDate', ''); } } else { $query->set('hide_upcoming', true); $query->set('start_date', date_i18n(TribeDateUtils::DBDATETIMEFORMAT)); $query->set('orderby', self::set_orderby()); $query->set('order', self::set_order()); self::$start_date = $query->get('start_date'); } // eventCat becomes a standard taxonomy query - will need to deprecate and update views eventually if (!in_array($query->get(TribeEvents::TAXONOMY), array('', '-1'))) { $tax_query[] = array('taxonomy' => TribeEvents::TAXONOMY, 'field' => is_numeric($query->get(TribeEvents::TAXONOMY)) ? 'id' : 'slug', 'terms' => $query->get(TribeEvents::TAXONOMY), 'include_children' => false); } // Only add the postmeta hack if it's not the main admin events list // Because this method filters out drafts without EventStartDate. // For this screen we're doing the JOIN manually in TribeEventsAdminList $screen = !is_admin() || defined('DOING_AJAX') && DOING_AJAX ? null : get_current_screen(); if (empty($screen) || $screen->id != 'edit-tribe_events') { $meta_query[] = array('key' => '_EventStartDate', 'type' => 'DATETIME'); } } // filter by Venue ID if ($query->tribe_is_event_query && $query->get('venue') != '') { $meta_query[] = array('key' => '_EventVenueID', 'value' => $query->get('venue')); } // filter by Organizer ID if ($query->tribe_is_event_query && $query->get('organizer') != '') { $meta_query[] = array('key' => '_EventOrganizerID', 'value' => $query->get('organizer')); } // proprietary metaKeys go to standard meta if ($query->tribe_is_event_query && $query->get('metaKey') != '') { $meta_query[] = array('key' => $query->get('metaKey'), 'value' => $query->get('metaValue')); } // enable pagination setup if ($query->tribe_is_event_query && $query->get('numResults') != '') { $query->set('posts_per_page', $query->get('numResults')); } elseif ($query->tribe_is_event_query && $query->get('posts_per_page') == '') { $query->set('posts_per_page', (int) tribe_get_option('postsPerPage', 10)); } // hide upcoming events from query (only not in admin) if ($query->tribe_is_event_query && $query->get('hide_upcoming')) { $hide_upcoming_ids = self::getHideFromUpcomingEvents(); if (!empty($hide_upcoming_ids)) { $query->set('post__not_in', $hide_upcoming_ids); } } if ($query->tribe_is_event_query && !empty($meta_query)) { // setup default relation for meta queries $meta_query['relation'] = 'AND'; $meta_query_combined = array_merge((array) $meta_query, (array) $query->get('meta_query')); $query->set('meta_query', $meta_query_combined); } if ($query->tribe_is_event_query && !empty($tax_query)) { // setup default relation for tax queries $tax_query_combined = array_merge((array) $tax_query, (array) $query->get('tax_query')); $query->set('tax_query', $tax_query_combined); } if ($query->tribe_is_event_query) { add_filter('posts_orderby', array(__CLASS__, 'posts_orderby'), 10, 2); } // if is in the admin remove the event date & upcoming filters, unless is an ajax call global $current_screen; if (is_admin() && $query->tribe_is_event_query && !empty($current_screen->id) && $current_screen->id == 'edit-' . TribeEvents::POSTTYPE) { if (!defined('DOING_AJAX') || defined('DOING_AJAX') && !DOING_AJAX) { // remove_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 ); remove_filter('posts_where', array(__CLASS__, 'posts_where'), 10, 2); remove_filter('posts_fields', array(__CLASS__, 'posts_fields')); remove_filter('posts_distinct', array(__CLASS__, 'posts_distinct')); remove_filter('posts_groupby', array(__CLASS__, 'posts_groupby')); $query->set('post__not_in', ''); // set the default order for posts within admin lists if (!isset($query->query['order'])) { $query->set('order', 'DESC'); } else { // making sure we preserve the order supplied by the query string even if it is overwritten above $query->set('order', $query->query['order']); } } } if ($query->tribe_is_event_query) { do_action('tribe_events_pre_get_posts', $query); } return $query; }