From e3d9c677c170ec34b52dfa0546eb4600d6996abd Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Sat, 7 Mar 2026 13:39:01 -0600 Subject: [PATCH] Consolidate team ordering and add explicit away-first settings --- includes/sp-event-team-ordering.php | 272 +++++++++++++ templates/event-list.php | 576 ++++++++++++++++++++++++++++ templates/event-results.php | 133 +++++++ tonys-sportspress-enhancements.php | 1 + 4 files changed, 982 insertions(+) create mode 100644 includes/sp-event-team-ordering.php create mode 100644 templates/event-list.php create mode 100644 templates/event-results.php diff --git a/includes/sp-event-team-ordering.php b/includes/sp-event-team-ordering.php new file mode 100644 index 0000000..635c425 --- /dev/null +++ b/includes/sp-event-team-ordering.php @@ -0,0 +1,272 @@ + esc_attr__( 'Order', 'sportspress' ), + 'desc' => esc_attr__( 'Show away team first', 'tonys-sportspress-enhancements' ), + 'id' => 'tony_sportspress_event_results_away_first', + 'default' => 'yes', + 'type' => 'checkbox', + ); + + return $options; +} +add_filter( 'sportspress_result_options', 'tony_sportspress_add_event_results_order_option' ); + +/** + * Override SportsPress event templates with plugin versions. + * + * @param string $template Located template path. + * @param string $template_name Template filename. + * @param string $template_path Template base path. + * @return string + */ +function tony_sportspress_locate_event_list_template( $template, $template_name, $template_path ) { + $supported = array( + 'event-list.php', + 'event-results.php', + ); + + if ( ! in_array( $template_name, $supported, true ) ) { + return $template; + } + + $override = dirname( __DIR__ ) . '/templates/' . $template_name; + if ( file_exists( $override ) ) { + return $override; + } + + return $template; +} +add_filter( 'sportspress_locate_template', 'tony_sportspress_locate_event_list_template', 10, 3 ); + +/** + * Add admin styles for explicit Home/Away labels on event edit screens. + */ +function tony_sportspress_event_team_order_admin_styles() { + $screen = get_current_screen(); + if ( ! $screen || 'sp_event' !== $screen->post_type ) { + return; + } + ?> + + post_type ) { + return; + } + + $slot_labels = array( + __( 'Home Team', 'tonys-sportspress-enhancements' ), + __( 'Away Team', 'tonys-sportspress-enhancements' ), + ); + $show_away_first = tony_sportspress_reverse_teams_enabled(); + ?> + + $team_id ) { + if ( array_key_exists( $team_id, $main_results ) ) { + $ordered[ $team_id ] = $main_results[ $team_id ]; + continue; + } + + // SportsPress main_results() can be positional (0,1,...) in team order. + if ( array_key_exists( $index, $main_results ) ) { + $ordered[ $team_id ] = $main_results[ $index ]; + } + } + + if ( empty( $ordered ) ) { + return $main_results; + } + + foreach ( $main_results as $team_id => $result ) { + if ( array_key_exists( $team_id, $ordered ) ) { + continue; + } + + // Skip positional keys that have already been remapped to team IDs. + if ( is_int( $team_id ) || ctype_digit( (string) $team_id ) ) { + $position = (int) $team_id; + if ( array_key_exists( $position, $teams ) ) { + continue; + } + } + + $ordered[ $team_id ] = $result; + } + + return $ordered; +} +add_filter( 'sportspress_event_list_main_results', 'tony_sportspress_event_list_score_order', 999, 2 ); diff --git a/templates/event-list.php b/templates/event-list.php new file mode 100644 index 0000000..b6f9610 --- /dev/null +++ b/templates/event-list.php @@ -0,0 +1,576 @@ + null, + 'title' => false, + 'status' => 'default', + 'format' => 'default', + 'date' => 'default', + 'date_from' => 'default', + 'date_to' => 'default', + 'date_past' => 'default', + 'date_future' => 'default', + 'date_relative' => 'default', + 'day' => 'default', + 'league' => null, + 'season' => null, + 'venue' => null, + 'team' => null, + 'teams_past' => null, + 'date_before' => null, + 'player' => null, + 'number' => -1, + 'show_team_logo' => get_option( 'sportspress_event_list_show_logos', 'no' ) == 'yes' ? true : false, + 'link_events' => get_option( 'sportspress_link_events', 'yes' ) == 'yes' ? true : false, + 'link_teams' => get_option( 'sportspress_link_teams', 'no' ) == 'yes' ? true : false, + 'link_venues' => get_option( 'sportspress_link_venues', 'yes' ) == 'yes' ? true : false, + 'responsive' => get_option( 'sportspress_enable_responsive_tables', 'no' ) == 'yes' ? true : false, + 'sortable' => get_option( 'sportspress_enable_sortable_tables', 'yes' ) == 'yes' ? true : false, + 'scrollable' => get_option( 'sportspress_enable_scrollable_tables', 'yes' ) == 'yes' ? true : false, + 'paginated' => get_option( 'sportspress_event_list_paginated', 'yes' ) == 'yes' ? true : false, + 'rows' => get_option( 'sportspress_event_list_rows', 10 ), + 'order' => 'default', + 'columns' => null, + 'show_all_events_link' => false, + 'show_title' => get_option( 'sportspress_event_list_show_title', 'yes' ) == 'yes' ? true : false, + 'title_format' => get_option( 'sportspress_event_list_title_format', 'title' ), + 'time_format' => get_option( 'sportspress_event_list_time_format', 'combined' ), +); + +extract( $defaults, EXTR_SKIP ); + +$calendar = new SP_Calendar( $id ); +if ( $status != 'default' ) { + $calendar->status = $status; +} +if ( $format != 'default' ) { + $calendar->event_format = $format; +} +if ( $date != 'default' ) { + $calendar->date = $date; +} +if ( $date_from != 'default' ) { + $calendar->from = $date_from; +} +if ( $date_to != 'default' ) { + $calendar->to = $date_to; +} +if ( $date_past != 'default' ) { + $calendar->past = $date_past; +} +if ( $date_future != 'default' ) { + $calendar->future = $date_future; +} +if ( $date_relative != 'default' ) { + $calendar->relative = $date_relative; +} +if ( $league ) { + $calendar->league = $league; +} +if ( $season ) { + $calendar->season = $season; +} +if ( $venue ) { + $calendar->venue = $venue; +} +if ( $team ) { + $calendar->team = $team; +} +if ( $teams_past ) { + $calendar->teams_past = $teams_past; +} +if ( $date_before ) { + $calendar->date_before = $date_before; +} +if ( $player ) { + $calendar->player = $player; +} +if ( $order != 'default' ) { + $calendar->order = $order; +} +if ( $day != 'default' ) { + $calendar->day = $day; +} +$data = $calendar->data(); +$usecolumns = $calendar->columns; + +if ( isset( $columns ) ) : + if ( is_array( $columns ) ) { + $usecolumns = $columns; + } else { + $usecolumns = explode( ',', $columns ); + } +endif; + +$title_format_raw = $title_format; +$is_awayhome_format = 'awayhome' === $title_format_raw; +if ( $is_awayhome_format ) { + $title_format = 'homeaway'; +} +$home_label = $is_awayhome_format ? esc_attr__( 'Away', 'sportspress' ) : esc_attr__( 'Home', 'sportspress' ); +$away_label = $is_awayhome_format ? esc_attr__( 'Home', 'sportspress' ) : esc_attr__( 'Away', 'sportspress' ); + +if ( $show_title && false === $title && $id ) : + $caption = $calendar->caption; + if ( $caption ) { + $title = $caption; + } else { + $title = get_the_title( $id ); + } +endif; +$labels = array(); +// Create a unique identifier based on the current time in microseconds +$identifier = uniqid( 'eventlist_' ); +?> +
+ +

+ +
+ + + + ' . esc_attr__( 'Date', 'sportspress' ) . ''; + + switch ( $title_format ) { + case 'homeaway': + if ( sp_column_active( $usecolumns, 'event' ) ) { + echo ''; + } + + if ( 'combined' == $time_format && sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + $labels[] = esc_attr__( 'Time/Results', 'sportspress' ); + } elseif ( in_array( $time_format, array( 'separate', 'results' ) ) && sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'event' ) ) { + echo ''; + } + + if ( in_array( $time_format, array( 'separate', 'time' ) ) && sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + break; + default: + if ( sp_column_active( $usecolumns, 'event' ) ) { + if ( $title_format == 'teams' ) { + echo ''; + } else { + echo ''; + } + } + + switch ( $time_format ) { + case 'separate': + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + if ( sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + break; + case 'time': + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + break; + case 'results': + if ( sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + break; + default: + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + } + } + + if ( sp_column_active( $usecolumns, 'league' ) ) { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'season' ) ) { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'venue' ) ) { + echo ''; + } else { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'article' ) ) { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'day' ) ) { + echo ''; + } + + do_action( 'sportspress_event_list_head_row', $usecolumns ); + ?> + + + + 0 ) { + $limit = $number; + } + + foreach ( $data as $event ) : + if ( isset( $limit ) && $i >= $limit ) { + continue; + } + + $teams = get_post_meta( $event->ID, 'sp_team' ); + $video = get_post_meta( $event->ID, 'sp_video', true ); + $status = get_post_meta( $event->ID, 'sp_status', true ); + + $main_results = apply_filters( 'sportspress_event_list_main_results', sp_get_main_results( $event ), $event->ID ); + + $reverse_results = $is_awayhome_format; + $reverse_teams = false; + if ( 'homeaway' === $title_format ) { + $reverse_teams = $is_awayhome_format; + } elseif ( 'teams' === $title_format ) { + $reverse_teams = get_option( 'sportspress_event_reverse_teams', 'no' ) === 'yes' ? true : false; + } + + if ( $reverse_results ) { + $main_results = array_reverse( $main_results, true ); + } + + $teams_output = ''; + $team_class = ''; + $teams_array = array(); + $team_logos = array(); + + if ( $teams ) : + foreach ( $teams as $t => $team ) : + $name = sp_team_short_name( $team ); + if ( $name ) : + + $name = '' . $name; + + if ( $show_team_logo ) : + if ( has_post_thumbnail( $team ) ) : + $logo = ''; + $team_logos[] = $logo; + $team_class .= ' has-logo'; + + if ( $t ) : + $name = $logo . ' ' . $name; + else : + $name .= ' ' . $logo; + endif; + endif; + endif; + + if ( $link_teams ) : + $team_output = ''; + else : + $team_output = $name; + endif; + + $team_result = sp_array_value( $main_results, $team, null ); + + if ( $team_result != null ) : + if ( $usecolumns != null && ! in_array( 'time', $usecolumns ) ) : + $team_output .= ' (' . $team_result . ')'; + endif; + endif; + + $teams_array[] = $team_output; + + $teams_output .= $team_output . '
'; + endif; + endforeach; + else : + $teams_output .= '—'; + endif; + + echo ''; + + $date_html = '' . get_post_time( 'Y-m-d H:i:s', false, $event ) . '' . apply_filters( 'sportspress_event_date', get_post_time( get_option( 'date_format' ), false, $event, true ), $event->ID ); + + if ( $link_events ) { + $date_html = ''; + } + + echo ''; + + // Check if the reverse_teams option is selected and alter the teams order + if ( $reverse_teams ) { + $teams_array = array_reverse( $teams_array, true ); + } + + switch ( $title_format ) { + case 'homeaway': + if ( sp_column_active( $usecolumns, 'event' ) ) { + $team = array_shift( $teams_array ); + echo ''; + } + + if ( 'combined' == $time_format && sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } elseif ( in_array( $time_format, array( 'separate', 'results' ) ) && sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + + if ( sp_column_active( $usecolumns, 'event' ) ) { + $team = array_shift( $teams_array ); + echo ''; + } + + if ( in_array( $time_format, array( 'separate', 'time' ) ) && sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + break; + default: + if ( sp_column_active( $usecolumns, 'event' ) ) { + if ( $title_format == 'teams' ) { + echo ''; + } else { + $title_html = implode( ' ', $team_logos ) . ' ' . $event->post_title; + if ( $link_events ) { + $title_html = '' . $title_html . ''; + } + echo ''; + } + } + + switch ( $time_format ) { + case 'separate': + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + if ( sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + break; + case 'time': + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + break; + case 'results': + if ( sp_column_active( $usecolumns, 'results' ) ) { + echo ''; + } + break; + default: + if ( sp_column_active( $usecolumns, 'time' ) ) { + echo ''; + } + } + } + + if ( sp_column_active( $usecolumns, 'league' ) ) : + echo ''; + endif; + + if ( sp_column_active( $usecolumns, 'season' ) ) : + echo ''; + endif; + + if ( sp_column_active( $usecolumns, 'venue' ) ) : + echo ''; + else : + echo ''; + endif; + + if ( sp_column_active( $usecolumns, 'article' ) ) : + echo ''; + endif; + + if ( sp_column_active( $usecolumns, 'day' ) ) : + echo ''; + endif; + + do_action( 'sportspress_event_list_row', $event, $usecolumns ); + + echo ''; + + $i++; + endforeach; + ?> + +
' . esc_html( $home_label ) . '' . esc_attr__( 'Time/Results', 'sportspress' ) . '' . esc_attr__( 'Results', 'sportspress' ) . '' . esc_html( $away_label ) . '' . esc_attr__( 'Time', 'sportspress' ) . '' . esc_attr__( 'Teams', 'sportspress' ) . '' . esc_attr__( 'Event', 'sportspress' ) . '' . esc_attr__( 'Time', 'sportspress' ) . '' . esc_attr__( 'Results', 'sportspress' ) . '' . esc_attr__( 'Time', 'sportspress' ) . '' . esc_attr__( 'Results', 'sportspress' ) . '' . esc_attr__( 'Time/Results', 'sportspress' ) . '' . esc_attr__( 'League', 'sportspress' ) . '' . esc_attr__( 'Season', 'sportspress' ) . '' . esc_attr__( 'Venue', 'sportspress' ) . '' . esc_attr__( 'Article', 'sportspress' ) . '' . esc_attr__( 'Match Day', 'sportspress' ) . '
' . wp_kses( $date_html, array( 'a' => array( 'href' => array(), 'itemprop' => array() ), 'date' => array() ) ) . '' . wp_kses_post( $team ) . ''; + if ( $link_events ) { + echo ''; + } + echo ''; + if ( $link_events ) { + echo ''; + } + echo '' . wp_kses_post( $team ) . ''; + if ( $link_events ) { + echo ''; + } + echo '' . wp_kses_post( $teams_output ) . '' . wp_kses_post( $title_html ) . ''; + if ( $link_events ) { + echo ''; + } + echo ''; + if ( $link_events ) { + echo ''; + } + echo ''; + if ( $link_events ) { + echo ''; + } + echo ''; + if ( $link_events ) { + echo ''; + } + echo ''; + if ( $link_events ) { + echo ''; + } + echo ''; + $leagues = get_the_terms( $event->ID, 'sp_league' ); + if ( $leagues ) : + echo wp_kses_post( implode( ', ', wp_list_pluck( $leagues, 'name' ) ) ); + endif; + echo ''; + $seasons = get_the_terms( $event->ID, 'sp_season' ); + if ( $seasons ) : + echo wp_kses_post( implode( ', ', wp_list_pluck( $seasons, 'name' ) ) ); + endif; + echo ''; + echo '
'; + if ( $link_venues ) : + the_terms( $event->ID, 'sp_venue' ); + else : + $venues = get_the_terms( $event->ID, 'sp_venue' ); + if ( $venues ) : + echo wp_kses_post( implode( ', ', wp_list_pluck( $venues, 'name' ) ) ); + endif; + endif; + echo '
'; + echo '
'; + if ( $link_events ) { + echo ''; + } + echo ''; + $day = get_post_meta( $event->ID, 'sp_day', true ); + if ( '' == $day ) { + echo '-'; + } else { + echo wp_kses_post( $day ); + } + echo '
+
+ ' . esc_attr__( 'View all events', 'sportspress' ) . '
'; + } + ?> + diff --git a/templates/event-results.php b/templates/event-results.php new file mode 100644 index 0000000..d0b0ce1 --- /dev/null +++ b/templates/event-results.php @@ -0,0 +1,133 @@ +status(); + +if ( 'results' != $status ) { + return; +} + +if ( ! isset( $caption ) ) { + $caption = esc_attr__( 'Results', 'sportspress' ); +} + +// Get event result data +$data = $event->results(); + +// The first row should be column labels +$labels = $data[0]; + +// Remove the first row to leave us with the actual data +unset( $data[0] ); + +$data = array_filter( $data ); + +if ( empty( $data ) ) { + return false; +} + +$scrollable = get_option( 'sportspress_enable_scrollable_tables', 'yes' ) == 'yes' ? true : false; +$link_teams = get_option( 'sportspress_link_teams', 'no' ) == 'yes' ? true : false; +$show_outcomes = array_key_exists( 'outcome', $labels ); + +// Initialize +$output = ''; +$table_rows = ''; +$i = 0; + +// Event Results row order is controlled by a dedicated Event Results option. +$away_first = get_option( 'tony_sportspress_event_results_away_first', 'yes' ) === 'yes' ? true : false; +if ( $away_first ) { + $data = array_reverse( $data, true ); +} + +foreach ( $data as $team_id => $result ) : + if ( $show_outcomes ) : + $outcomes = array(); + $result_outcome = sp_array_value( $result, 'outcome' ); + if ( ! is_array( $result_outcome ) ) : + $outcomes = array( '—' ); + else : + foreach ( $result_outcome as $outcome ) : + $the_outcome = get_page_by_path( $outcome, OBJECT, 'sp_outcome' ); + if ( is_object( $the_outcome ) ) : + $outcomes[] = $the_outcome->post_title; + endif; + endforeach; + endif; + endif; + + unset( $result['outcome'] ); + + $table_rows .= ''; + + $team_name = sp_team_short_name( $team_id ); + + if ( $link_teams && sp_post_exists( $team_id ) ) : + $team_name = '' . $team_name . ''; + endif; + + $table_rows .= '' . $team_name . ''; + + foreach ( $labels as $key => $label ) : + if ( in_array( $key, array( 'name', 'outcome' ) ) ) { + continue; + } + if ( array_key_exists( $key, $result ) && $result[ $key ] != '' ) : + $value = $result[ $key ]; + else : + $value = apply_filters( 'sportspress_event_empty_result_string', '—' ); + endif; + $table_rows .= '' . $value . ''; + endforeach; + + if ( $show_outcomes ) : + $table_rows .= '' . implode( ', ', $outcomes ) . ''; + endif; + + $table_rows .= ''; + + $i++; +endforeach; + +if ( empty( $table_rows ) ) : + + return false; + +else : + + $output .= '

' . $caption . '

'; + + $output .= '
' . + '' . + ''; + foreach ( $labels as $key => $label ) : + $output .= ''; + endforeach; + $output .= '' . '' . ''; + $output .= $table_rows; + $output .= '' . '
' . esc_attr__( 'Team', 'sportspress' ) . '' . $label . '
' . '
'; + +endif; +?> +
+ +
diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index 4553e30..c6f67b8 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -20,3 +20,4 @@ require_once plugin_dir_path(__FILE__) . 'includes/sp-event-permalink.php'; require_once plugin_dir_path(__FILE__) . 'includes/sp-event-csv.php'; require_once plugin_dir_path(__FILE__) . 'includes/sp-event-admin-week-filter.php'; require_once plugin_dir_path(__FILE__) . 'includes/sp-event-quick-edit-officials.php'; +require_once plugin_dir_path(__FILE__) . 'includes/sp-event-team-ordering.php';