v0.18.0 - Work In Progress

🟡 * Performance - Club data stored in dedicated database table for faster page loads
🟡 * Performance - Competition data stored in dedicated database table for faster page loads
🟡 * Performance - Standing data stored in dedicated database table for faster page loads
🟡 * Performance - Squad data stored in dedicated database table for faster page loads
🟠 * Fix - Shortcode spacing, display, and text alignment utilities now reliably override theme styles (notably Kadence's `.entry-content` rules)
🟡 * Performance - Faster loading for Matches, Clubs, Competitions, Players, and Standings admin list pages on sites with many entities
🟠 * Fix - Club, referee, and entity links built via the simple link building fast path now resolve correctly on WordPress installs in a subdirectory
🟡 * Performance - Faster sitemap generation for large sites with many matches and players
🟠 * Fix - Standing list refreshes correctly after match saves (previously could lag up to 30 days)
🟡 * Performance - Faster loading of competition admin metabox for multi-stage competitions
🟠 * Fix - Shortcode modal in Classic Editor missing styles
🟠 * Fix - Substitution batch import column mapping for player in/out fields
🟠 * Fix - Club card statistics counting extra yellow cards from second-yellow-to-red events
🚀 * New Feature - Active Roster - clubs now have ONE current squad you can edit without picking a season. Historical seasons live in a separate Season Squad Archive (append, replace, or clear past rosters from the same screen). [anwpfl-squad] without `season_id` renders the active roster; with `season_id` renders that season's archive.
🟢 * Add - Historical roster fallback for old seasons - when a season's squad archive is empty, the [anwpfl-squad] shortcode derives the roster from match participation (lineups + named bench across that season's finished matches) instead of returning empty or showing the current squad
🟢 * Update - Theme overrides for `shortcode-squad*.php` and `club/club-squad.php` need re-syncing - the old `empty($season_id)` guard blocks active-squad rendering
⚠️ * Note - Historical roster fallback limitations: training-only / cup-only-pre-eliminated players are absent; `status` flags (`on loan`, `on trial`, `left`) are lost; jersey numbers and positions reflect most-recent values, not per-match
🟢 * Add - Cleanup tab in Toolbox to remove old club and squad postmeta after migration to the new clubs table
🟢 * Update - Club season dropdown filter now derives seasons purely from match data - clubs with squad-only season data (no matches yet) will drop from the filter, add a match or assign the club to the filter manually
🟢 * Add - Custom title and value fields in club CSV import (Data Import tool)
🟠 * Fix - Standing clone setup screen rendering, cascade delete on standing removal, and confirm popover in Toolbox Cleanup tab