*/ function tony_sportspress_event_filter_defaults() { return array( 'month' => true, 'week' => true, 'team' => true, 'venue' => true, 'league' => true, 'season' => true, 'match_day' => true, ); } /** * Build user meta key for an event filter screen option. * * @param string $key Filter key. * @return string */ function tony_sportspress_event_filter_meta_key( $key ) { return 'tony_sp_event_filter_' . $key; } /** * Check whether a filter is enabled for the current user. * * @param string $key Filter key. * @return bool */ function tony_sportspress_event_filter_enabled( $key ) { $defaults = tony_sportspress_event_filter_defaults(); if ( ! array_key_exists( $key, $defaults ) ) { return true; } $user_id = get_current_user_id(); if ( ! $user_id ) { return (bool) $defaults[ $key ]; } $stored = get_user_meta( $user_id, tony_sportspress_event_filter_meta_key( $key ), true ); if ( '' === $stored ) { return (bool) $defaults[ $key ]; } return '1' === (string) $stored; } /** * Persist event filter Screen Options via AJAX. */ function tony_sportspress_save_event_filter_screen_options_ajax() { if ( ! current_user_can( 'edit_posts' ) ) { wp_send_json_error(); } check_ajax_referer( 'tony_sp_event_filters', 'nonce' ); $defaults = tony_sportspress_event_filter_defaults(); $filters = isset( $_POST['filters'] ) && is_array( $_POST['filters'] ) ? $_POST['filters'] : array(); $user_id = get_current_user_id(); foreach ( $defaults as $key => $_enabled ) { $value = isset( $filters[ $key ] ) ? sanitize_text_field( wp_unslash( $filters[ $key ] ) ) : '0'; update_user_meta( $user_id, tony_sportspress_event_filter_meta_key( $key ), '1' === $value ? '1' : '0' ); } wp_send_json_success(); } add_action( 'wp_ajax_tony_sp_event_filter_prefs_save', 'tony_sportspress_save_event_filter_screen_options_ajax' ); /** * Add filter visibility toggles to Screen Options on event list admin page. * * @param string $settings Existing settings HTML. * @param WP_Screen $screen Current screen. * @return string */ function tony_sportspress_event_filter_screen_options_markup( $settings, $screen ) { if ( ! $screen || 'edit-sp_event' !== $screen->id ) { return $settings; } $labels = array( 'month' => __( 'Month/Year', 'tonys-sportspress-enhancements' ), 'week' => __( 'Week', 'tonys-sportspress-enhancements' ), 'team' => __( 'Team', 'tonys-sportspress-enhancements' ), 'venue' => __( 'Venue', 'tonys-sportspress-enhancements' ), 'league' => __( 'League', 'tonys-sportspress-enhancements' ), 'season' => __( 'Season', 'tonys-sportspress-enhancements' ), 'match_day' => __( 'Match Day', 'tonys-sportspress-enhancements' ), ); $settings .= '
'; $settings .= '' . esc_html__( 'Event Filters', 'tonys-sportspress-enhancements' ) . ''; foreach ( $labels as $key => $label ) { $meta_key = tony_sportspress_event_filter_meta_key( $key ); $checked = tony_sportspress_event_filter_enabled( $key ) ? ' checked="checked"' : ''; $settings .= ''; } $settings .= '
'; return $settings; } add_filter( 'screen_settings', 'tony_sportspress_event_filter_screen_options_markup', 10, 2 ); /** * Parse an ISO week input (e.g. 2026-W07) from the request. * * @return array{year:int,week:int}|null */ function tony_sportspress_parse_admin_week_filter() { if ( empty( $_GET['sp_week_filter'] ) ) { return null; } $raw = sanitize_text_field( wp_unslash( $_GET['sp_week_filter'] ) ); if ( ! preg_match( '/^(\d{4})-W(0[1-9]|[1-4][0-9]|5[0-3])$/', $raw, $matches ) ) { return null; } $year = (int) $matches[1]; $week = (int) $matches[2]; return array( 'year' => $year, 'week' => $week, ); } /** * Render week filter control in event admin list. * * @param string $post_type Current post type. */ function tony_sportspress_render_admin_week_filter( $post_type ) { if ( 'sp_event' !== $post_type ) { return; } if ( ! tony_sportspress_event_filter_enabled( 'week' ) ) { return; } $value = ''; if ( ! empty( $_GET['sp_week_filter'] ) ) { $value = sanitize_text_field( wp_unslash( $_GET['sp_week_filter'] ) ); } $summary_text = __( 'Select a week', 'tonys-sportspress-enhancements' ); $parsed = tony_sportspress_parse_admin_week_filter(); if ( is_array( $parsed ) ) { $timezone = wp_timezone(); $monday = ( new DateTimeImmutable( 'now', $timezone ) )->setISODate( $parsed['year'], $parsed['week'], 1 )->setTime( 0, 0, 0 ); $sunday = $monday->modify( '+6 days' )->setTime( 23, 59, 59 ); /* translators: 1: Monday label/date, 2: Sunday label/date. */ $summary_text = sprintf( __( '%1$s to %2$s', 'tonys-sportspress-enhancements' ), wp_date( 'D M j, Y', $monday->getTimestamp(), $timezone ), wp_date( 'D M j, Y', $sunday->getTimestamp(), $timezone ) ); } ?> id ) { return; } $hide = array( 'month' => ! tony_sportspress_event_filter_enabled( 'month' ), 'team' => ! tony_sportspress_event_filter_enabled( 'team' ), 'venue' => ! tony_sportspress_event_filter_enabled( 'venue' ), 'league' => ! tony_sportspress_event_filter_enabled( 'league' ), 'season' => ! tony_sportspress_event_filter_enabled( 'season' ), 'match_day' => ! tony_sportspress_event_filter_enabled( 'match_day' ), 'week' => ! tony_sportspress_event_filter_enabled( 'week' ), ); ?> id ) { return; } ?> is_main_query() ) { return; } $post_type = $query->get( 'post_type' ); if ( 'sp_event' !== $post_type ) { return; } $parsed = tony_sportspress_parse_admin_week_filter(); if ( null === $parsed ) { return; } $timezone = wp_timezone(); $monday = ( new DateTimeImmutable( 'now', $timezone ) )->setISODate( $parsed['year'], $parsed['week'], 1 )->setTime( 0, 0, 0 ); $sunday = $monday->modify( '+6 days' )->setTime( 23, 59, 59 ); $date_query = $query->get( 'date_query' ); if ( ! is_array( $date_query ) ) { $date_query = array(); } $date_query[] = array( 'after' => array( 'year' => (int) $monday->format( 'Y' ), 'month' => (int) $monday->format( 'n' ), 'day' => (int) $monday->format( 'j' ), ), 'before' => array( 'year' => (int) $sunday->format( 'Y' ), 'month' => (int) $sunday->format( 'n' ), 'day' => (int) $sunday->format( 'j' ), ), 'inclusive' => true, ); $query->set( 'date_query', $date_query ); } add_action( 'pre_get_posts', 'tony_sportspress_apply_admin_week_filter' );