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
🟢 * Add - "Formula" column type for team stats in the Stats Configurator (multi-operand expressions over team stat columns, with the same safety guards as player formula stats)
🟠 * Fix - "Remove Player Photo Duplicates" tool now skips files that can't be processed and continues, instead of stopping the entire batch
🟠 * Fix - Wrong sort order in standings using "away" or "fewer cards" ranking rules when matches reference clubs removed from the group
🟠 * Fix - "Missing Players" section no longer shows each injured player twice (existing duplicates are cleaned up automatically on update)
🟠 * Fix - "Automatically Suspend Players" toggle now works on manually-created competitions even when API Import is configured for other competitions
🟢 * Add - Template Status admin page (Settings & Tools > Template Status) - detects theme and third-party plugin template overrides, compares @version tags against plugin defaults, and flags patterns that need updating before the next database migration
🟢 * Add - Custom stats (xG, possession time, etc.) now available in Head-to-Head team stats shortcode
🟢 * Add - Calculated and formula stat columns can now be used as the match formation / lineups rating pill (Configurator > Match Lineups)
🟢 * Add - ":avg" modifier on Player Stats Panel shortcode to show per-game average as the main value (e.g. stats="distance:avg")
🟡 * Performance - API import configuration no longer autoloaded on every page request
🟠 * Fix - Shortcode spacing, display, and text alignment utilities now reliably override theme styles (notably Kadence's `.entry-content` rules)
🟠 * Fix - Cache flush no longer wipes other plugins' data on sites with Redis or Memcached
🟠 * Fix - Suspension risk shortcode now properly cached on sites with object cache
🚀 * New Feature - Public REST API - opt-in via Settings & Tools > API. Includes anonymous live match polling (score, clock, events, lineups), public read endpoints for competitions / clubs / players / taxonomies, and authenticated endpoints for third-party apps to manage matches, lineups, and statistics.
🟡 * Improve - Faster loading of competition admin metabox for multi-stage competitions
🟠 * Fix - Fatal error on club pages when third-party menu plugins pass string post ID (AnWP Mega Menu)
🟢 * Add - Support for AWD (Technical Loss) and WO (WalkOver) fixture statuses in API-Football import
🚀 * New Feature - Player Merge Tool (FL API Import > Toolkit) - detect duplicate players via slug or DOB, preview impact on stats and lineups, merge duplicates, and clean up orphaned player records
🟢 * Add - "Who Will Win" probabilities from bookmaker odds with configurable bookmaker selection
🟠 * Fix - Stats shortcodes no longer crash the site when used without scope filters
🟠 * Fix - Formula and calculated stats not working in Stat::Players shortcode
🟠 * Fix - Stat::Clubs shortcode showing incorrect card totals
🟠 * Fix - Referee stats cache never being saved
🟠 * Fix - Clean sheets counted for all positions instead of goalkeepers only
🟢 * Add - Calculated and formula stats now supported in Stats::Players Custom shortcode
🔒 * Security - Captain custom_numbers in lineup API now scoped to own-side players (prevents cross-team writes)
🟠 * Fix - Standing H2H toggle in admin not reflecting saved state (always rendered OFF regardless of stored value)
🟠 * Fix - Squad kebab dropdowns in Club editor clipped by container overflow (now use Popover API to escape)
⚠️ * Note - Suspension warnings may include extra players after the historical roster fallback change in core - derived rosters can't recover the "left" status flag, so departed players appear in the at-risk list (false positives, no false negatives)
🚀 * New Feature - Site Migration (Settings & Tools > Site Migration) - copy a competition (matches, standings, clubs, players, staff, lineups, stats, squads, transfers) from one WordPress site to another over a donor / recipient REST connection with Application Password auth
🟢 * Update - Transfer "Register in squad" no longer writes per-season - players added through the Transfer UI always go on the active roster; the `season_id` field in the REST payload is now ignored