// ========================================================================= // SHORTCODE: Goal Value Report - /goal-value/ // ========================================================================= add_shortcode('otg_goal_value', 'otg_render_goal_value'); function otg_render_goal_value($atts) { global $wpdb; // 1. Get Parameters & Dropdown Options $available_seasons = $wpdb->get_col("SELECT DISTINCT season FROM otg_rangers_games ORDER BY season DESC"); $most_recent_season = $wpdb->get_var("SELECT season FROM otg_rangers_games ORDER BY game_date DESC LIMIT 1"); $default_season = !empty($most_recent_season) ? $most_recent_season : (!empty($available_seasons) ? reset($available_seasons) : ''); $game_type = isset($_GET['game_type']) ? sanitize_text_field($_GET['game_type']) : '2'; $season_start = isset($_GET['season_start']) ? sanitize_text_field($_GET['season_start']) : $default_season; $season_end = isset($_GET['season_end']) ? sanitize_text_field($_GET['season_end']) : $default_season; $opponent_abbr = isset($_GET['opponent_abbr']) ? sanitize_text_field($_GET['opponent_abbr']) : 'ALL'; // Sorting parameters $gv_sort = isset($_GET['gv_sort']) ? sanitize_text_field($_GET['gv_sort']) : 'total_value'; $gv_dir = isset($_GET['gv_dir']) ? sanitize_text_field($_GET['gv_dir']) : 'desc'; // Smart Year Validation if (!empty($season_start) && !empty($season_end) && $season_start > $season_end) { $season_start = $season_end; } $season_where = ""; if (!empty($season_start) && !empty($season_end)) { $season_where = $wpdb->prepare("AND g.season BETWEEN %s AND %s", $season_start, $season_end); } $game_filter = ""; if ($opponent_abbr !== 'ALL') { $game_filter = $wpdb->prepare("AND g.opponent_abbr = %s", $opponent_abbr); } // Fetch Teams for filters $season_teams_query = $wpdb->prepare(" SELECT DISTINCT st.abbreviation, st.team FROM otg_standings_nhl st JOIN otg_rangers_games g ON st.abbreviation = g.opponent_abbr AND st.season = g.season WHERE g.season = %s ORDER BY st.team ASC ", $season_start); $season_teams = $wpdb->get_results($season_teams_query); $all_teams = $wpdb->get_results("SELECT DISTINCT abbreviation, team FROM otg_standings_nhl ORDER BY team ASC"); $season_team_abbrs = []; foreach ($season_teams as $st) { $season_team_abbrs[] = $st->abbreviation; } // 2. Fetch all scoring plays for Rangers games matching filters to calculate total game goals & situational weights $scoring_query = $wpdb->prepare(" SELECT s.game_id, s.period, s.time_elapsed, s.team_abbr, s.scorer_name, s.scorer_id, s.strength, s.home_score, s.away_score, s.goal_modifier, g.home_team_abbr, g.season, p.id as player_internal_id FROM otg_rangers_scoring s JOIN otg_rangers_games g ON s.game_id = g.game_id LEFT JOIN otg_players p ON s.scorer_id = p.nhl_id WHERE s.time_elapsed != '00:00' AND (s.goal_modifier IS NULL OR s.goal_modifier != 'shootout') AND g.game_type = %s $season_where $game_filter ORDER BY s.game_id ASC, s.period ASC, CAST(SUBSTRING_INDEX(s.time_elapsed, ':', 1) AS UNSIGNED) ASC, CAST(SUBSTRING_INDEX(s.time_elapsed, ':', -1) AS UNSIGNED) ASC ", $game_type); $all_scoring_plays = $wpdb->get_results($scoring_query); // Group plays by game_id to count total goals per game and track running scores/game-winners $games_plays = []; foreach ($all_scoring_plays as $play) { $games_plays[$play->game_id][] = $play; } $player_goal_values = []; foreach ($games_plays as $game_id => $plays) { $total_game_goals = count($plays); if ($total_game_goals <= 0) continue; $base_fraction = 1 / $total_game_goals; $final_home = (int)end($plays)->home_score; $final_away = (int)end($plays)->away_score; $nyr_won = ($final_home > $final_away && $plays[0]->home_team_abbr === 'NYR') || ($final_away > $final_home && $plays[0]->home_team_abbr !== 'NYR'); $loser_score = ($final_home > $final_away) ? $final_away : $final_home; $gw_target = $loser_score + 1; $gwg_assigned = false; foreach ($plays as $index => $play) { $is_nyr = ($play->team_abbr === 'NYR'); $home_score = (int)$play->home_score; $away_score = (int)$play->away_score; $prev_h = ($index > 0) ? (int)$plays[$index - 1]->home_score : 0; $prev_a = ($index > 0) ? (int)$plays[$index - 1]->away_score : 0; // Check GWG for this play $is_gwg = false; $is_winner_team = ($final_home > $final_away) ? ($play->home_team_abbr === 'NYR') : ($play->home_team_abbr !== 'NYR'); if ($nyr_won && $is_winner_team && !$gwg_assigned) { $cur_nyr_score = ($play->home_team_abbr === 'NYR') ? $home_score : $away_score; if ($cur_nyr_score === $gw_target) { $is_gwg = true; $gwg_assigned = true; } } if ($is_nyr) { $goal_val = $base_fraction; $is_ot = ((int)$play->period >= 4); if ($is_ot) $goal_val += 1.0; $is_first = ($index === 0); if ($is_first) $goal_val += 0.5; $was_tied_or_trailing = ($play->home_team_abbr === 'NYR') ? ($prev_h <= $prev_a) : ($prev_a <= $prev_h); $is_now_leading = ($play->home_team_abbr === 'NYR') ? ($home_score > $away_score) : ($away_score > $home_score); $is_go_ahead = ($was_tied_or_trailing && $is_now_leading); if ($is_go_ahead) $goal_val += 0.5; if ($is_gwg) $goal_val += 0.5; $was_leading_by_1 = ($play->home_team_abbr === 'NYR') ? ($prev_h == $prev_a + 1) : ($prev_a == $prev_h + 1); $is_now_leading_by_2 = ($play->home_team_abbr === 'NYR') ? ($home_score == $away_score + 2) : ($away_score == $home_score + 2); $is_insurance = ($was_leading_by_1 && $is_now_leading_by_2); if ($is_insurance) $goal_val += 0.25; $is_sh = (isset($play->strength) && strtolower($play->strength) === 'sh'); if ($is_sh) $goal_val += 0.5; $is_pp = (isset($play->strength) && strtolower($play->strength) === 'pp'); if ($is_pp) $goal_val += 0.25; $is_en = (isset($play->goal_modifier) && strtolower($play->goal_modifier) === 'empty-net'); if ($is_en) $goal_val += 0.1; $p_name = !empty($play->scorer_name) ? $play->scorer_name : 'Unknown'; $p_id = !empty($play->player_internal_id) ? $play->player_internal_id : ''; if (!isset($player_goal_values[$p_name])) { $player_goal_values[$p_name] = [ 'player_internal_id' => $p_id, 'name' => $p_name, 'goals' => 0, 'total_value' => 0.0, 'ot_count' => 0, 'first_count' => 0, 'go_ahead_count' => 0, 'gwg_count' => 0, 'insurance_count' => 0, 'shg_count' => 0, 'ppg_count' => 0, 'eng_count' => 0 ]; } if (empty($player_goal_values[$p_name]['player_internal_id']) && !empty($p_id)) { $player_goal_values[$p_name]['player_internal_id'] = $p_id; } $player_goal_values[$p_name]['goals']++; $player_goal_values[$p_name]['total_value'] += $goal_val; if ($is_ot) $player_goal_values[$p_name]['ot_count']++; if ($is_first) $player_goal_values[$p_name]['first_count']++; if ($is_go_ahead) $player_goal_values[$p_name]['go_ahead_count']++; if ($is_gwg) $player_goal_values[$p_name]['gwg_count']++; if ($is_insurance) $player_goal_values[$p_name]['insurance_count']++; if ($is_sh) $player_goal_values[$p_name]['shg_count']++; if ($is_pp) $player_goal_values[$p_name]['ppg_count']++; if ($is_en) $player_goal_values[$p_name]['eng_count']++; } } } // Sort player goal values table uasort($player_goal_values, function($a, $b) use ($gv_sort, $gv_dir) { $val_a = $a[$gv_sort] ?? 0; $val_b = $b[$gv_sort] ?? 0; if ($gv_sort === 'name') { $cmp = strcasecmp($a['name'], $b['name']); return ($gv_dir === 'desc') ? -$cmp : $cmp; } if ($val_a == $val_b) { return strcasecmp($a['name'], $b['name']); } return ($gv_dir === 'desc') ? ($val_b - $val_a) : ($val_a - $val_b); }); // Helper for table headers sorting $render_gv_th = function($col_key, $label, $align = 'center') use ($gv_sort, $gv_dir) { $is_sorted = ($gv_sort === $col_key); $arrow = ''; if ($is_sorted) { $arrow = ($gv_dir === 'desc') ? ' ' : ' '; } $class = $is_sorted ? 'highlight-col' : ''; return '' . $label . '' . $arrow . ''; }; $input_style = 'width: 100%; height: 38px; padding: 0 10px; background: #222; border: 1px solid #444; color: #fff; border-radius: 4px; box-sizing: border-box; font-size: 0.9em;'; $current_url_clean = strtok($_SERVER["URI"] ?? $_SERVER['REQUEST_URI'], '?'); $output = '
'; // Header $output .= '
'; $output .= '
Rangers Advanced Goal Value Report
'; $base_q_params = '&opponent_abbr='.urlencode($opponent_abbr).'&season_start='.urlencode($season_start).'&season_end='.urlencode($season_end).'&gv_sort='.urlencode($gv_sort).'&gv_dir='.urlencode($gv_dir); $output .= '
'; $output .= 'Regular Season'; $output .= 'Playoffs'; $output .= '
'; $output .= '
'; // Filters Form $output .= '
'; foreach ($_GET as $bk => $bv) { if (!in_array($bk, ['game_type', 'opponent_abbr', 'season_start', 'season_end', 'gv_sort', 'gv_dir', 'modal_min', 'modal_type'])) { if (!is_array($bv)) { $output .= ''; } } } $output .= ''; $output .= ''; $output .= ''; $output .= '
'; // Opponent $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Start Season $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // End Season $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Buttons $output .= '
'; $output .= ''; $output .= 'Clear'; $output .= '
'; $output .= '
'; $output .= '
'; // Explanation Box / Formula Legend $output .= '
'; $output .= 'Goal Value Scoring System Legend:'; $output .= '
'; $output .= '
Base Value: 1 / Total Goals Scored in Game
'; $output .= '
Overtime Goal (OT): +1.0
'; $output .= '
First Goal of Game: +0.5
'; $output .= '
Go-Ahead Goal: +0.5
'; $output .= '
Game Winner (GWG): +0.5
'; $output .= '
Insurance Goal (+2 lead): +0.25
'; $output .= '
Short-Handed Goal (SH): +0.5
'; $output .= '
Power Play Goal (PP): +0.25
'; $output .= '
Empty Net Goal (EN): +0.1
'; $output .= '
'; $output .= '
'; // Table Styling $output .= ''; // Render Table Card $output .= '
'; $output .= '
Player Goal Value Rankings
'; $output .= '
'; $output .= ''; $output .= ''; // Name header $is_name_sorted = ($gv_sort === 'name'); $name_arrow = $is_name_sorted ? (($gv_dir === 'asc') ? ' ' : ' ') : ''; $output .= ''; $output .= $render_gv_th('goals', 'Goals'); $output .= $render_gv_th('total_value', 'Total Goal Value'); $output .= $render_gv_th('ot_count', 'OT Goals'); $output .= $render_gv_th('first_count', '1st Goals'); $output .= $render_gv_th('go_ahead_count', 'Go-Ahead'); $output .= $render_gv_th('gwg_count', 'GWG'); $output .= $render_gv_th('insurance_count', 'Insurance'); $output .= $render_gv_th('shg_count', 'SHG'); $output .= $render_gv_th('ppg_count', 'PPG'); $output .= $render_gv_th('eng_count', 'ENG'); $output .= ''; if (!empty($player_goal_values)) { $tot_goals = 0; $tot_value = 0.0; $tot_ot = 0; $tot_first = 0; $tot_go_ahead = 0; $tot_gwg = 0; $tot_insurance = 0; $tot_shg = 0; $tot_ppg = 0; $tot_eng = 0; foreach ($player_goal_values as $p_name => $stats) { $tot_goals += $stats['goals']; $tot_value += $stats['total_value']; $tot_ot += $stats['ot_count']; $tot_first += $stats['first_count']; $tot_go_ahead += $stats['go_ahead_count']; $tot_gwg += $stats['gwg_count']; $tot_insurance += $stats['insurance_count']; $tot_shg += $stats['shg_count']; $tot_ppg += $stats['ppg_count']; $tot_eng += $stats['eng_count']; $display_name = esc_html($stats['name']); if (!empty($stats['player_internal_id'])) { $p_url = home_url('/profile/?player_id=' . urlencode($stats['player_internal_id'])); $display_name = '' . esc_html($stats['name']) . ''; } $output .= ''; $output .= ''; $cells = [ 'goals' => $stats['goals'], 'total_value' => number_format($stats['total_value'], 3), 'ot_count' => ($stats['ot_count'] > 0 ? $stats['ot_count'] : '-'), 'first_count' => ($stats['first_count'] > 0 ? $stats['first_count'] : '-'), 'go_ahead_count' => ($stats['go_ahead_count'] > 0 ? $stats['go_ahead_count'] : '-'), 'gwg_count' => ($stats['gwg_count'] > 0 ? $stats['gwg_count'] : '-'), 'insurance_count' => ($stats['insurance_count'] > 0 ? $stats['insurance_count'] : '-'), 'shg_count' => ($stats['shg_count'] > 0 ? $stats['shg_count'] : '-'), 'ppg_count' => ($stats['ppg_count'] > 0 ? $stats['ppg_count'] : '-'), 'eng_count' => ($stats['eng_count'] > 0 ? $stats['eng_count'] : '-') ]; foreach ($cells as $ckey => $cval) { $is_col_sorted = ($gv_sort === $ckey); $extra_style = ($ckey === 'total_value') ? 'font-weight: bold; color: #3498db;' : ''; $output .= ''; } $output .= ''; } // Totals row $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } else { $output .= ''; } $output .= '
Player Name' . $name_arrow . '
' . $display_name . '' . $cval . '
Team Totals' . $tot_goals . '' . number_format($tot_value, 3) . '' . $tot_ot . '' . $tot_first . '' . $tot_go_ahead . '' . $tot_gwg . '' . $tot_insurance . '' . $tot_shg . '' . $tot_ppg . '' . $tot_eng . '
No goal records found matching the selected filters.
'; // JavaScript for Column Sorting $output .= ''; $output .= '
'; return $output; } x10003q – Activity – OutsideTheGarden Boards – Page 92
FEBRUARY
«
Wed
18
Thu
19
Fri
20
Sat
21
Sun
22
Mon
23
Tue
24
»
x10003q
x10003q
Group: Registered
Joined: 2023-09-04
Legend
Follow
Soucy off for interference

In forum Where Smit Hits The Fan

10 months ago
1-0 after 2, 11:38pm in NYC

In forum Where Smit Hits The Fan

10 months ago
trivia - Anderson is the answer

In forum Where Smit Hits The Fan

10 months ago
Laba throws it at the net and it goes off a defender but hit...

In forum Where Smit Hits The Fan

10 months ago
Rangers stunk on that non pp, but there was a lot of back ch...

In forum Where Smit Hits The Fan

10 months ago
Rangers cannot get into the offensive end

In forum Where Smit Hits The Fan

10 months ago
Van with lots of shorty shots

In forum Where Smit Hits The Fan

10 months ago
Van gets a penalty

In forum Where Smit Hits The Fan

10 months ago
Quick with a big toe save

In forum Where Smit Hits The Fan

10 months ago
Boesser gets a puck to the face

In forum Where Smit Hits The Fan

10 months ago
Edstrom interference pp VAn

In forum Where Smit Hits The Fan

10 months ago
Pettersson gets points for bravery, but he took a beating &...

In forum Where Smit Hits The Fan

10 months ago
end of 1, 1-0 Rangers

In forum Where Smit Hits The Fan

10 months ago
Carrick vs Pettersson and Carrick laid some big fists - Ran...

In forum Where Smit Hits The Fan

10 months ago
Cuylle took two swings to get the puck to Zib and somehow he...

In forum Where Smit Hits The Fan

10 months ago
Page 92 / 417