>
// =========================================================================
// 8. SHORTCODE: Team Development Camp Roster - /development-camp/
// =========================================================================
add_shortcode('dev_camp_roster_full', 'render_dev_camp_roster_full');
function render_dev_camp_roster_full() {
global $wpdb;
// 1. Handle Year Selection via GET parameter (default to max prospect/dev camp year if not set)
$available_years = $wpdb->get_col("SELECT DISTINCT camp_year FROM otg_camp_roster WHERE camp_type = 'Prospect' ORDER BY camp_year DESC");
$latest_year = isset($_GET['camp_year']) ? intval($_GET['camp_year']) : 0;
if (!$latest_year || !in_array($latest_year, $available_years)) {
$latest_year = !empty($available_years) ? intval($available_years[0]) : intval($wpdb->get_var("SELECT MAX(camp_year) FROM otg_camp_roster WHERE camp_type='Prospect'"));
}
if (!$latest_year) {
return "No development camp data found.";
}
// Retrieve Development Camp Settings by matching the first 4 characters of season to $latest_year
$camp_settings = $wpdb->get_row($wpdb->prepare(
"SELECT season, dev_start, dev_end, dev_location FROM otg_rangers_season_settings WHERE LEFT(season, 4) = %s LIMIT 1",
$latest_year
));
$dev_camp_dates_str = '';
$start_date_obj = null;
$end_date_obj = null;
if ($camp_settings && !empty($camp_settings->dev_start) && !empty($camp_settings->dev_end)) {
$start_date_obj = new DateTime($camp_settings->dev_start);
$end_date_obj = new DateTime($camp_settings->dev_end);
$start_month = $start_date_obj->format('F');
$end_month = $end_date_obj->format('F');
if ($start_month === $end_month) {
$dev_camp_dates_str = $start_date_obj->format('F j') . '-' . $end_date_obj->format('j');
} else {
$dev_camp_dates_str = $start_date_obj->format('F j') . ' - ' . $end_date_obj->format('F j');
}
if (!empty($camp_settings->dev_location)) {
$dev_camp_dates_str .= '
Location: ' . $camp_settings->dev_location;
}
}
// Check which camp types actually exist for this selected year to conditionally display navigation links
$has_training = (intval($wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM otg_camp_roster WHERE camp_year = %d AND camp_type = 'Training'", $latest_year))) > 0);
$has_rookie = (intval($wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM otg_camp_roster WHERE camp_year = %d AND camp_type = 'Rookie'", $latest_year))) > 0);
$has_dev = (intval($wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM otg_camp_roster WHERE camp_year = %d AND camp_type = 'Prospect'", $latest_year))) > 0);
$positions = ['Forward', 'Defenseman', 'Goaltender'];
$target_date = new DateTime('2026-06-29');
// Start output wrapper constrained to 100% width, max-width 1800px, and left-justified matching stats browser
$output = '
| Player | # | Ht | Wt | Hand | Birthdate | Age | Team | Birthplace | Country | GP | ' . $h_goals_wins . ' | ' . $h_assists_losses . ' | ' . $h_pts_ot . ' | ' . $h_pim_gaa . ' |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No players found for this position. | ||||||||||||||
| ' . $name . ' | ' . esc_html($clean_jersey) . ' | ' . esc_html($p->height) . ' | ' . esc_html($p->weight) . ' | ' . esc_html($p->hand) . ' | ' . esc_html($p->birthdate) . ' | ' . esc_html($age) . ' | ' . esc_html($p->team_name) . ' | ' . esc_html($p->birth_city) . ' | ' . esc_html($p->country) . ' | ' . esc_html($p->gp) . ' | ' . esc_html($p->goals) . ' | ' . esc_html($p->assists) . ' | ' . esc_html($p->points) . ' | ' . esc_html($stat_five) . ' |