v1.3.6 - 2026-09-09

🟠 * Fix - Choosing your sport on a new install could leave every game, team, player and season page returning "page not found". The plugin builds its own web addresses for those pages - /american-football/game/..., /basketball/team/... - and rebuilds that list whenever you change which sports you use. The rebuild ran a fraction of a second too early: it saved the list before the newly chosen sport had been added to it, so what got stored still described the sport you had just switched away from. Core WordPress pages and the admin area were unaffected, which made it read as a theme or permalink problem rather than a plugin one, and nothing corrected it later on its own - a site set up this way stayed that way until permalinks were saved by hand under Settings > Permalinks. Existing sites were mostly spared by accident, because any plugin update that changes the database version rebuilds the list as a side effect, which is why this went unnoticed for so long. Nothing was ever lost or corrupted: the games, teams and players imported correctly and simply had no address to answer on
🟠 * Fix - Text you can rename under Settings > Translations still could not be translated into another language. Renaming and translating are two separate mechanisms and only the first of them worked: a heading you renamed changed everywhere as expected, but the same text handed to a translator never reached the translation file, so a German or Spanish site went on showing English no matter how complete the translation was. Nothing on screen could tell you which of the two you were looking at. This covered 302 pieces of on-screen text - standings column headings, game statistics rows, box score sections, the timeline, odds, brackets and the shortcodes built on them - and the translation file has grown from 411 entries to 548 as a result. Verified on a German build: text that never translated at all now does, and the same nine pages across three sports render identically in English. A check runs as part of our test suite so this cannot quietly return

v1.3.5 - 2026-09-08

🟠 * Fix - Importing game details could tell you it had finished while importing nothing at all. When the sports API stops responding, the plugin trips a safety cut-out that stops it hammering a dead connection - that part works and is there to keep your site up. What went wrong is that the import chain could not tell "the connection is gone" apart from "there was nothing left to do", so it walked through every remaining batch in an instant, wrote nothing, and reported a clean finish. On a full NFL season that meant all 285 fixtures created and only 120 of them with box scores, and pressing Import again gained about five games per attempt while reporting success every time. The import now stops the moment the connection is gone, says so plainly, and tells you how many seconds until a retry is worth trying. Nothing was ever lost or corrupted: the games it never reached stayed queued, which is why re-running kept finding them correctly. Roster, team profile and odds imports could go quiet in the same way and are fixed too
🟠 * Fix - A game could be recorded as fully imported with no box score, and never looked at again. If the sports API answered the main game request but failed on one of the follow-up requests behind it - the lineups, the team statistics, the play-by-play - the import stamped the game complete anyway and moved on. Nothing re-checks a game marked complete, so that missing box score stayed missing permanently, and the only way to recover it was to find the game yourself and re-update it by hand. The safety cut-out above did not catch this one either: the main request had just succeeded, so as far as it was concerned the connection was healthy. A game now advances to complete only when every request behind it actually completed - if the connection drops or the provider returns a server error, the game stays in the queue and the next import picks it up, and the batch reports it as failed rather than done. A "not found" reply still counts as an answer, because some competitions genuinely have no lineups, so those games are not retried forever. The same failure could also record a whole season as having no lineups, no team statistics or no play-by-play at all, on the strength of one bad minute at the provider - and that verdict was written once and never revisited, which quietly switched those imports off for the rest of the season. A failed request no longer counts as evidence either way
🟠 * Fix - The Home and Away buttons on American Football Team Rankings changed only 3 of the 13 rows. Points, Opponent Points and Point Difference switched correctly, while total, passing and rushing yards per game, first downs, third down %, red zone %, field goal %, turnovers and penalties all kept showing the all-games figure and the all-games rank whichever button you pressed. Every number looked plausible on its own, so there was nothing on the page to suggest the split wasn't being applied. Season Statistics on a season page had the same problem and is fixed with it
🟠 * Fix - Renaming a stat group heading under Settings > Translations had no effect on most blocks. A heading you renamed took effect in the blocks that read their data from the API and was quietly ignored everywhere the data comes from your own database, so one site could show the same heading two different ways depending on which block you were looking at. All 20 group headings are now renameable, and any name you had already saved is carried across automatically. "Kicking & Discipline" also could not be translated in any language, because that one heading never reached the translation file
🟠 * Fix - 80 pieces of on-screen text could not be renamed under Settings > Translations. Every row of the game team statistics block - Field Goals, Rebounds, Turnovers, Biggest Lead, Hits, Earned Runs, Passing Yards, Red Zone and the rest - along with the Starters, Bench and Team Totals headings on box scores, all seven American Football box score sections, the R, H and E column letters on baseball games, the Home and Away record labels under the game header, and the empty-state messages on shortcodes, were all written to be renameable and then never added to the list the Translations screen reads from. They rendered in English with no way to change them and nothing to explain why, and the same gap meant an exported translation file skipped them silently on import. All 80 are listed now, each with a note saying where it appears. A check runs as part of our test suite so a string cannot drop off that list again

v1.3.4 - 2026-09-08

🟠 * Fix - Stats Comparison on an American Football game printed empty "Rebounding" and "Playmaking" headings. The block had no American Football branch and fell through to the basketball stat list, so only the three names the two sports share came through - Points, FG% and Opponent Points - and two headings printed with nothing beneath them. All 13 ranked stats now show, grouped Scoring, Offense, and Kicking & Discipline, the same grouping Team Rankings uses. The block ships switched on in the default layout for upcoming games, so every American Football site was showing this on every fixture page
🟠 * Fix - A stat group with nothing to show no longer prints its heading. Any group left with no stats is dropped, and a block that ends up with no groups and no chart now renders nothing at all instead of an empty frame under its title. That is what stops the next sport we add from repeating the blank headings above. Team Rankings on a team page got the same American Football branch and the same treatment

v1.3.3 - 2026-09-07

🟠 * Fix - Baseball season pages could fail with a critical error on the Team Statistics block. The block computes its table once and then serves it from the cache, so this only struck when the cache was cold - the first view after an import, a sync or a settings change, or simply the first view after the cached copy expired. That made it read as intermittent: a page that broke on one visit loaded normally on the next. The block ships in the default baseball season layout, so every baseball site had it switched on. On our own demo it hit 57 times over three days. Basketball and American Football season pages were never affected, because they reach their team statistics through a different path - which is also why this got past testing. Introduced in 1.2.11, when the Regular Season / Playoffs stage filter was added to the season blocks

v1.3.2 - 2026-09-07

🟢 * Add - AmericanFootballApi as a fourth API provider, for sites that import American Football and nothing else. It is $9.99/mo against $19.99 for the multi-sport AllSportsAPI2, so an NFL-only site stops paying for seven sports it never touches. Pick it under API & Import > API Config and the sport list locks to American Football, the same way the basketball and baseball providers already work. Every endpoint the plugin uses was checked against it before it was offered: box scores, team statistics, incidents, standings, playoff brackets, fixtures, rosters, images and per-game odds all return the same data as the multi-sport provider and on the same IDs. Two things to know before switching. Its Pro plan is capped at 15,000 requests a day rather than unlimited, which is roughly ten times what a full NFL season import spends, and bulk odds are not offered - exactly as they are not offered for American Football on AllSportsAPI2 either. It is a separate RapidAPI subscription, so you will need a key for it

v1.3.1 - 2026-09-07

🟠 * Fix - Choosing the BaseballAPI provider in API Config was discarded on save. The page reported success and the setting stayed on whatever it was before, with nothing to say the choice had not been kept. Only the Test Connection button ever wrote it, so anyone who picked the provider and pressed Save came away with the old one still active. The accepted provider list is now read from the adapter itself rather than kept as a second copy, so it cannot fall behind again
🟠 * Fix - American Football Team Rankings on a season page showed 3 stat cards where 13 are calculated. The block had no American Football branch and fell through to the basketball stat list, so only the three names the two sports share came through - Points Per Game, Field Goal % and Opponent Points. Total, passing and rushing yards per game, first downs, third down %, red zone %, turnovers and penalties were all being computed and ranked on every season page, and none of them were shown. All 13 now render, grouped Scoring, Offense, and Kicking & Discipline
🟠 * Fix - Key Players on an upcoming American Football game showed three zeroes labelled PPG, RPG and APG. The block fell through to that same basketball stat list, and those stats do not exist in American Football data, so every lookup missed and printed 0. It now shows the yardage breakdown the data actually holds - passing, rushing and receiving - so a quarterback reads 962 PASS / 173 RUSH and a receiver 492 REC

v1.3.0 - 2026-09-03

🟠 * Fix - Your sitemap files were returning "404 Not Found" to Google while showing correct XML in a browser. WordPress runs an ordinary blog-posts query on a sitemap request and marks the response 404 when that unrelated query comes back empty, then prints the sitemap anyway - so the file looks perfect to you and doesn't exist as far as a crawler is concerned. Any site with a thin blog was affected on page 2 and beyond (a site with 10 published posts got one page, the rest 404), and since WordPress 7.1 a site with no published posts at all got 404 on every file including the index. On our own demo Google had read 2 of 41 sitemap files, and since August none. The plugin now keeps sitemap requests out of that check, so real files answer 200 and the ones that should not exist still 404
🟢 * Add - Settings > SEO, a new section with two rules for pages that have nothing to say. Both mean "noindex, follow" plus removal from the sitemap: search engines stop indexing the page, visitors still see it, links still work and link equity still flows. Nothing is deleted and nothing is hidden from your site
🟢 * Add - Player pages with no statistics are hidden from search engines, on by default. A player who has never appeared in an imported game has a page with nothing on it but a name, and a few thousand of those read to Google as mass-generated filler that can hold back the rest of the site. After updating you get a one-time notice with the count on your site and a link to the setting, plus a "No stats" filter in the Players list so you can see exactly which players it covers. Turn it off in Settings > SEO
🟢 * Add - Excluded Leagues, for a competition you import for completeness but don't want ranking - a lower division, or a college league with thousands of squad players. Pick a league and tick which of its pages to keep out of search: players, games, teams, seasons, in any combination. Players are ticked by default because they are usually the reason to exclude a league
🟠 * Fix - Every game description shipped a broken conditional tag. Basketball and baseball finished and upcoming layouts use a date placeholder that was never registered, so instead of a date the description read "recap[IFFebruary 19, 2024], February 19, 2024[ENDIFFebruary 19, 2024]" - on every game page, on every site, since March. American Football finished games had a similar problem with a placeholder that isn't a game variable and printed as literal "%date%"
🟠 * Fix - Season names in titles and descriptions no longer repeat the league. The provider's season names already include it, so "%league_name% %season_name%" produced "MLB MLB 2026", "NFL NFL 26/27" and "NBA All Star Game NBA All Star Game 2024". The league name is now dropped from the season half when it's already there, which leaves every layout you have written working as it is
🟠 * Fix - Sitemap dates were telling search engines that every page on your site changed on each sync. The last-modified date came from the sync timestamp, which moves whether or not anything about the page changed. Finished games now use their own kickoff time, which stops changing when the game does; player pages carry no date at all rather than a date that isn't true. A last-modified date crawlers learn to distrust is worse than none
🟠 * Fix - Sitemaps could list the same URL on two pages and drop others entirely. The ordering wasn't unique on a multi-sport site, so the database was free to break ties differently on each page request. Both the URL list and the page count now come from the same rule, so the count always matches what the pages actually contain
🟠 * Fix - The WordPress users sitemap is no longer offered. It exposes the author archive, which on a Hub site lists the same entity pages the entity sitemaps already carry, under a URL nothing links to
🟠 * Fix - On sites running Yoast or Rank Math, the pages hidden from search were still listed in the sitemap. Both plugins switch off the WordPress sitemap and serve their own, and theirs included every entity page whether or not the SEO rules covered it - so on the same site a stat-less player page asked search engines not to index it while the sitemap advertised it for indexing. Their sitemaps now follow the same rules as the WordPress one, checked against both plugins on 9,000 pages. SEO SIMPLE PACK was never affected, because it leaves the WordPress sitemap in place. Saving a setting in Settings > SEO also clears Rank Math's cached sitemap files, so the change shows up on the next request instead of whenever the cache happened to expire
🟠 * Fix - Deleting an American Football season left every player and team statistics row behind. The season, its games and their pages went; the statistics rows stayed, pointing at a season that no longer existed. Nothing rendered them and nothing reported them, so the only sign was a row count that never went down. Basketball and baseball were not affected
🟠 * Fix - Head-to-head records on game pages counted a tied game as a win. Baseball and American football games that finish level carry their own result code, which the record didn't handle, so every tie went to whichever team was away. Basketball has no ties and is unaffected

v1.2.11 - 2026-09-03

🟢 * Add - Regular Season / Playoffs buttons on the four season stats blocks: Stat Leaders, Team Rankings, Player Averages and Team Statistics. These are the season-level counterparts of the team blocks that got the same buttons in 1.2.9, and they work the same way - each opens on Regular Season and filters everything it shows, so a playoff view lists only the teams and players who played that stage. On NBA 25/26 that is 30 teams under Regular Season, 16 under Playoffs and 8 under Play-In, instead of one table blending all three. It also closes an old gap in Team Statistics, where the games-played column came from the stats tables (91 for the 76ers) while the W-L beside it counted every finished game (50-44); under Regular Season both now read the same 82. Each block chooses which stage it opens on in the Layout Builder, and the buttons appear only on seasons where every imported game carries its stage
🟠 * Fix - NBA 2023/24 was missing its In-Season Tournament games from every total - 67 games that counted toward nothing. Those group and knockout games are regular season games for the NBA, but the data provider files them under a season of their own, so the two have to be linked; the 2024 and 2025 editions were, the first edition from 2023 never was. The season read 1166 regular season games where it holds 1233, team totals landed on 78-80 instead of 82, and a player's 2023/24 career row could be six games short. Nothing looked broken, because every number was internally consistent - just low. Updating repairs it, with no re-import and no API requests
🟠 * Fix - The season Stat Leaders and Team Rankings blocks rendered nothing when their Data Source was set to API - or, if the block had "No data" text configured, said no data was available, blaming the provider for a view that was never built. Neither block has ever had an API version; both read the games you have imported. The Data Source option is gone from both, and the shipped season layout is corrected on update. A layout you have edited yourself keeps its own copy and shows the usual update-available notice; the stale setting affects only the badge on the block card, never what the block renders

v1.2.10 - 2026-09-03

🟠 * Fix - Player and team stats could be missing games that the game pages themselves show. A league's fixture list can include games from a second competition - NBA Cup games arrive inside NBA 25/26, each carrying its own season - but that season was only ever created on a first import, so the games ended up filed under a season that did not exist on your site. Every stats query then dropped them without a word: a player read 60 regular season games instead of 66, with no NBA Cup button and no NBA Cup row in his career table, while his box score for those same games rendered normally. Our own demo site turned out to have 198 games sitting in this state
⚠️ * Note - There is nothing to do after updating. The repair runs once by itself, costs no API requests and needs no re-import, because the season name is already stored on your site. If a season still looks short afterwards, Copy Diagnostics on its row will say why
🟠 * Fix - The API & Import page reported such a season as fully imported. It showed "67 Games / 67 Detailed" beside an Update button, because the game count came from one table and the imported state from another - which is what hid the problem above through four rounds of a support ticket. The two are now counted separately and each row says where it stands: merged into its parent, not linked, season missing, or parent not imported. The row's own Import button now creates the missing season instead of doing nothing
🟢 * Add - Repair Seasons banner on the API & Import page, for the few seasons the automatic repair cannot name - which happens on leagues you have never opened in the browse list. It asks the provider for names on the affected leagues only, and says which ones it still could not resolve rather than leaving them silent
🟢 * Add - Copy Diagnostics in each browse row's quick-action menu copies that row's exact state - both tables counted separately, the parent link, and your plugin and database versions - ready to paste into a support ticket. It reads what the page already holds, so it spends no API requests
🟠 * Fix - "Run Now" on the background sync tasks gave no feedback at all, neither success nor failure, so the button read as dead and invited a second click. The task did start; only the report was missing

v1.2.9 - 2026-08-31

🚀 * New Feature - Regular Season / Playoffs buttons on five team blocks: Season Record, Season Statistics, Team Rankings, Team Leaders and Player Averages. They used to count every game a season contains, so a team that made the playoffs read 50-44 over 94 games while the Standings table right below it read 45-37 over 82. Each block now opens on Regular Season and the other stages are one click away. A playoff view ranks a team against the teams that made the playoffs, not all 30, and Team Leaders lists only the players who played that stage. The buttons show up on seasons where every imported game carries its stage (NBA, NFL, Euroleague). Blocks reading live provider aggregates are unchanged, because that data arrives already totalled.

⚠️ * Note - These numbers change on your site after updating. Nothing is recalculated, the same games are counted differently. To keep the old numbers, set "Default Stats Stage" to All in Settings & Tools > Settings > Display. A one-time notice after the update explains this with a link to the setting, and each block can pick its own opening stage in the Layout Builder.

🟠 * Fix - Standings HOME and AWAY columns no longer disagree with the W-L on their own row. They counted every phase of the season together, so a team showed 45-37 beside HOME 25-22 and AWAY 25-22, which adds up to 94 games rather than 82. This was wrong on every league and worst on cups: a Champions League group table counted a team's whole European run instead of its 6 group games.

🟠 * Fix - "Upcoming Games" no longer lists playoff games that were never played. A bracket is imported with every game a series could need, so a series ending 4-1 left games 6 and 7 sitting in Upcoming forever. On a finished season that meant 33 games dated months in the past.

🟠 * Fix - A tab whose block has nothing to show is now dropped from the tab bar instead of opening an empty panel.

🟢 * Add - The Description block now ships in the default team, player and season layouts, so text you enter on an entity appears without editing the layout first.

v1.2.8 - 2026-08-27

🚀 * New Feature - Playoff series standing - game pages and game cards now show where a playoff series stands: "Knicks lead 3-2", "Series tied 2-2", "Knicks win series 4-2". It reads the series score the data provider already sends with each playoff game, so there is nothing to configure and no extra API requests. Regular season games are left alone, and a series that hasn't started yet shows nothing. The three wordings are editable under Translations.

🟠 * Fix - An upcoming playoff game no longer shows the series standing frozen at the moment it was imported. A Game 6 imported after Game 3 used to read "leads 2-1" right up until tip-off, even after the series had moved to 3-2. The kickoff sync now refreshes it, at no extra API cost.

🚀 * New Feature - Per-season sync control (API & Import) - every season row has a new Sync column with Auto / On / Off. On Auto the plugin checks every 6 hours, starts syncing any season with upcoming games, and stops a league that has gone 30 days without one - that number is yours under API Config > Season Scheduling. Cups keep syncing until their season year has passed, since a knockout competition has no upcoming games between rounds. Seasons you set to On or Off by hand are never touched. Background sync stops spending API requests on seasons that ended years ago, and "Preview next run" shows what the next check would change before you leave it running.

⚠️ * Note - After updating, the first schedule check runs within a few hours. Until it does, background sync stays quiet - that is expected and nothing needs doing. If you switch "Schedule Seasons Automatically" off, only the seasons you set to On by hand are synced.

🟢 * Add - Player Splits now has the same season and stage buttons as the other player stats blocks - All, All {League}, and one button per season, plus Regular Season / Playoffs when a single season is selected. The Home/Away, Monthly and Wins/Losses tables all follow the selection, and each Splits block can choose which stage it opens on from its "Default Stage" option in the Layout Builder.

🟠 * Fix - The API & Import page now flags a linked sub-season you have not imported. NBA Cup games count as regular season games for the NBA, but the data provider files them under a separate season, so importing the NBA on its own left player regular season totals a few games short with nothing on screen to explain the gap.

🟠 * Fix - "Exclude from Stats" and "Include in Stats" on the Games list now work. The row action had never done anything since it shipped, so a game you excluded by hand stayed in the stats. The "Link to parent" action on the Seasons list was dead for the same reason.

v1.2.7 - 2026-08-22

🟠 * Fix - Background sync could stall for good on games the data provider has deleted - usually "if necessary" playoff games that were never played. It retried the same handful of dead games every 30 seconds and never moved on, so scores stopped filling in and the wasted requests counted against your API plan. Those games are now marked as skipped after the first empty response, and the sync carries on.

🟠 * Fix - Background sync now takes a different sport each run instead of always starting with the first one, so a backlog in one sport can't stop the others from updating.

🟠 * Fix - The API & Import page now tells you when a background sync task is mid-run rather than idle. It shows how long the run has been going and warns if a run hasn't finished within a day - previously that looked identical to the task being switched off.

v1.2.6 - 2026-08-19

🟢 * Add - New "Fill Stage Tags" button on the API & Import page fills the missing regular season / playoffs tag on MLB games you have already imported. The provider stopped sending that field for baseball in April 2026, which leaves a season half tagged and hides the stage buttons on player stats. The stage is worked out from bracket information the same import already stored, so it costs no API requests.
🟠 * Fix - Newly imported MLB games get their stage tag worked out during import, so a season you have filled in doesn't drift back to untagged as new games arrive.

v1.2.5 - 2026-08-17

🚀 * New Feature - Regular Season / Playoffs filter on player stats - All / Regular Season / Playoffs buttons now sit on Stat Rings, Game Log, vs. Opponents, Career Statistics and Advanced Stats, and the league ranks under each ring follow the selected stage. The buttons appear only for leagues where every imported game is tagged with its stage (NBA, NFL, EuroLeague, MLB 2025).
🟢 * Add - Career Statistics and Advanced Stats filter every season row and the career total together. A season the provider left untagged keeps all its games and is marked with an asterisk, so a career spanning tagged and untagged seasons never hides games.
🟢 * Add - New "Player Stats Default Stage" setting (Settings & Tools > Settings > Display) chooses whether those five blocks open on Regular Season or All games. Any single block can override it from its "Default Stage" option in the Layout Builder.
🟢 * Add - The stage button labels (All, Regular Season, Playoffs, Other) and the untagged-season footnote are editable under Translations - rename "Other" to "Play-In" if you run the NBA.
🟠 * Fix - Re-updating a game no longer erases its stored stage tag when the provider leaves that field empty. Affects MLB, where the provider stopped sending it in April 2026.

🚀 * New Feature - Injury Report - new blocks for league, team and game pages plus an [anwphub-injuries] shortcode. Players are grouped under Out for season / Out / Day-to-day headings, each with the injury and the date they went out, newest first. On a game page the two teams sit side by side, and a side with nobody hurt says so. Built from injury data the plugin already imports with the roster, so there is no extra API cost.
⚠️ * Note - The NBA is currently the only competition the provider reports injuries for. Everywhere else the blocks hide themselves instead of showing an empty card.

🚀 * New Feature - Clean entity URLs - new per-type "Hub clean slugs" options (Settings > Permalinks) drop the hash suffix from game, team, player and season links, so /player/melton-max instead of /player/melton-max-1a2b3c. The "Permalinks / Slugs" card on the Settings page re-slugs existing entities in one click, and WordPress redirects the old URLs to the new ones.

🟢 * Add - Player, team and season pages now have a WordPress content editor, so the Description block can show a bio or an evergreen write-up. Imports and syncs never overwrite what you type.
🟢 * Add - Umpire crew (home plate and base umpires) now shown on finished MLB game pages. Enable the new "Umpire Crew" import option in API Config, then re-import.

🟠 * Fix - Finished games in lower-tier leagues now import their box scores and stats reliably, even when the provider leaves the "finished" flag empty. Previously these games were skipped and left blank.
🟠 * Fix - Finished games waiting on a re-check now jump the queue ahead of postponed and canceled fixtures, and the re-check runs every 8 hours instead of once a day, so late-finishing games fill in their stats the same day.
🟠 * Fix - API requests now fail fast during a provider outage (DNS failure, connection refused, repeated 5xx) instead of hanging on dead connections, so multi-sport imports and cron don't tie up server workers.
🟠 * Fix - A live game no longer stays stuck showing a frozen in-progress score during a long API outage. After 24 hours the LIVE badge clears and the game is marked finished, then refreshes with the real final score once the API recovers.
🟠 * Fix - Live score updates now pause while the browser tab is in the background and refresh instantly when you switch back, instead of polling every 30 seconds in a tab nobody is watching.
🟠 * Fix - Stalled requests no longer leave a spinner stuck on the page - live scores time out after 12 seconds, and the calendar, scoreboard, team schedule, pitching leaders and game hover cards after 8 seconds. Admin screens show a clear "request timed out" message instead of spinning forever, while long jobs like imports and AI generation keep a much longer allowance.
🟠 * Fix - Charts and stats tables no longer pile up duplicate resize watchers each time a live game page swaps its layout, and switching seasons on a team's player averages table now survives a later window resize.
🟠 * Fix - Admin toggle switches are now announced correctly by screen readers and can be operated from the keyboard.

v1.2.4 - 2026-06-23

🟢 * Add - Keyboard navigation and screen-reader support for the Tabs container (arrow keys + Home/End, ARIA tab roles, visible focus ring)
🟢 * Add - Live score updates now flash in the scoring team's colour
🟠 * Fix - Layout Builder SEO titles and descriptions now apply when an SEO plugin (Yoast, Rank Math, SEOPress) is active
🟠 * Fix - WordPress 7.0 admin compatibility (buttons, entity lists, import and shortcode panels)
🟠 * Fix - Active section-navigation button keeps its readable contrast on hover, focus, and click, and now shows a keyboard focus ring
🟠 * Fix - Import task list no longer duplicates a task when the same season is added again
🟠 * Fix - Layout Builder: Colours and Border options now apply only to container blocks, where they take effect
🟠 * Fix - Layout Builder drag-and-drop now places blocks reliably into rows and tabs
🟢 * Update - Freemius SDK updated to 2.13.2

1.2.3 - 2026-04-27

🟠 * Fix - Live games no longer get stuck on a partial score when the API briefly reports "finished" mid-game (period-completeness check + admin audit endpoint to repair existing stuck games)
🟠 * Fix - Tab switching, live layout transitions, and chart refresh now work reliably on WP 6.9+ (continuation of earlier hook regression fix)
🟠 * Fix - Live game scores now update automatically on Calendar, Scoreboard, and Team Schedule shortcodes (regression on WP 6.9+)
🟠 * Fix - Calendar, Scoreboard, and game lists now switch upcoming games to live mode automatically when kickoff happens (no manual refresh needed)
🟠 * Fix - Custom text overrides on the Translations panel are now saved properly
🟠 * Fix - Playoff bracket matchups now align properly with their feeders (Wild Card → Divisional rounds no longer stack to the top)
🟠 * Fix - Playoff bracket now shows #1 seed bye slot at the bottom of the Wild Card column
🟢 * Add - YouTube thumbnails can now be stored locally to avoid sending visitor data to Google on every page view (new Highlights section in Plugin Settings)
🟠 * Fix - Team season records now include all played games (sync discovers games the API reschedules with new IDs)
🟠 * Fix - Player season averages, team rankings, and league leaderboards now include all imported games (existing data is corrected automatically on plugin update)
🟠 * Fix - Playoff games and brackets now import automatically after regular season ends
🟠 * Fix - Live basketball games now show the game clock (e.g. "Q3 5:55") on single game page and list cards
🟠 * Fix - Live baseball games now show the inning ("5th Inning") instead of "Halftime" or "P5"
🟢 * Add - American Football support (game/team/player/season pages, stats, import, box scores, team leaders, player averages)
🟡 * Performance - Faster XML sitemaps with lastmod support for better SEO crawling

v1.2.2 - 2026-04-01

🟠 * Fix - Pitching leaders now shows late-night West Coast games on the correct date
🟡 * Performance - Faster season page loading on cold cache

v1.2.1 - 2026-03-29

🟠 * Fix - Pitch data fetch now processes only the imported season instead of all MLB seasons

= 1.2.0 - 2026-03-28 =

🟡 * Improve - Pitch data import now runs in parallel (10 min per game down to ~20 seconds)

= 1.1.9 - 2026-03-28 =

🟠 * Fix - Pitching leaders column legend displaying broken text
🟠 * Fix - Pitching leaders query error when walks exceed strikeouts

= 1.1.8 - 2026-03-28 =

🟢 * Add - Daily Pitching Leaders shortcode with date navigation, Game Score badges, K splits, milestone badges
🟢 * Add - Pitch-by-pitch data import (MLB only) - whiffs, SwStr%, CSW% columns
🟢 * Add - Games display on correct dates based on visitor timezone
🟠 * Fix - Background sync no longer re-checks postponed games repeatedly
🟡 * Improve - Large season sync splits into smaller batches to prevent timeouts

= 1.1.7 - 2026-03-26 =

🔵 * Perf - Calendar always shows fresh game data (no stale page cache)
🔵 * Perf - Reduce memory usage in game list queries

= 1.1.6 - 2026-03-25 =

🔵 * Perf - Reduce frontend DB queries with bulk warming and caching
🟠 * Fix - Flush rewrite rules on DB upgrade to prevent 404s after reset

= 1.1.5 - 2026-03-25 =

🟠 * Fix - Scoreboard slider cards briefly showing vertically before initialization

= 1.1.4 - 2026-03-25 =

🟢 * Add - Postponed and canceled game status display on game cards and game page header
🟠 * Fix - Postponed status text disappearing on game pages

= 1.1.2 - 2026-03-24 =

🟢 * Add - Dual-column stats comparison with previous season data on upcoming game pages
🟢 * Add - Standings auto-hide when no games have been played
🟠 * Fix - Odds moneyline check failing with non-sequential array keys
🟠 * Fix - Standings badges now respect team display setting
🟡 * Tweak - Hide odds block when only moneyline data available

= 1.1.1 - 2026-03-24 =

🟠 * Fix - Fatal error on season/game pages when object cache returns unexpected type (HUB-BUG-054)

= 1.1.0 - 2026-03-24 =

🟠 * Fix - Games stuck as "Live" after import when not tracked by live pipeline
🟡 * Tweak - Scoreboard slider league label contrast and layout

= 1.0.8 - 2026-03-24 =

🟡 * Tweak - Calendar league header game count wrapped in parentheses
🟠 * Fix - Empty spread pill visible on finished calendar games
🟠 * Fix - Missing country flag for International leagues in season header

= 1.0.6 - 2026-03-23 =

🟢 * Add - Sport menu icons for WordPress navigation menus (9 sports, CSS-only)
🟡 * Tweak - Calendar league header game count display simplified

= 1.0.5 - 2026-03-23 =

🟢 * Add - "Delete with Data" action for seasons (removes games, stats, and cached data)
🟢 * Add - Manual run buttons for background sync tasks
🟠 * Fix - Live scores not activating for games scheduled later today
🟡 * Tweak - Games admin filter uses entity selector for season picking
🟡 * Tweak - Odds displayed as gray pill to differentiate from scores

= 1.0.4 - 2026-03-23 =

🟠 * Fix - International league flags not saving (database column too narrow)
🟠 * Fix - Import falsely stopping with "Daily API limit reached" on paid plans
🟡 * Tweak - Calendar game count styled as pill badge, hidden when filter active

= 1.0.3 - 2026-03-23 =

🟠 * Fix - International league flags now display correctly (Euroleague, ABA, Eurocup)
🟠 * Fix - Fatal error during hierarchy import (undefined ANWPHUB_DIR constant)
🟠 * Fix - Fatal error on game pages with stale cache data

= 1.0.2 - 2026-03-23 =

🟠 * Fix - Missing categories for international leagues (Euroleague, ABA, Eurocup) after hierarchy import

= 1.0.1 - 2026-03-23 =

🟠 * Fix - Missing flag icons for international leagues (ABA, Euroleague, Asian leagues)
🟠 * Fix - Stuck games recovery and duplicate key errors during import
🟡 * Update - Help links added to admin pages with import navigation guard
🟡 * Update - Season linking now applied automatically during import

v1.0.0 - 2026-03-22

🟢 * Add - Basketball support with 25-column box scores, aggregate stats, and advanced metrics
🟢 * Add - Baseball support with batting, pitching, and fielding stats (R/H/E display)
🟢 * Add - Layout Builder with game, team, player, and season page layouts per sport
🟢 * Add - 3 game state layouts (upcoming, live, finished) with automatic transitions
🟢 * Add - Row containers (fixed grid + fluid auto-fit) with responsive breakpoints
🟢 * Add - Tabs container with URL hash deep linking and resize hooks
🟢 * Add - Block navigation with scroll spy and sticky positioning
🟢 * Add - Code mode editor for layout builder (compact JSON, validation, enrichment)
🟢 * Add - Live scores with 4-phase backend pipeline and frontend polling
🟢 * Add - Live layout transitions (upcoming → live → finished) via AJAX swap
🟢 * Add - Background sync with 6 configurable tasks and smart season filtering
🟢 * Add - 13 shortcodes: games, calendar, bracket, standings, standings-full, scoreboard, leaders, roster, team-stats, leagues, game, entity-posts, highlights
🟢 * Add - Shortcode builder with live preview (auto-resize iframe, 3 width presets)
🟢 * Add - AI Writer for game reviews and previews (OpenAI integration + JSON export)
🟢 * Add - Odds display with 3 formats (fractional, decimal, American) and per-visitor preference
🟢 * Add - Bulk odds import (moneyline) and per-game enrichment (spread, total, period markets)
🟢 * Add - Video highlights with YouTube integration, validation, and auto-fetch cron
🟢 * Add - Entity selector with sport-aware grid layouts and inline filters
🟢 * Add - Color palette (9 slots) with Kadence theme auto-detection
🟢 * Add - CSS design tokens (border-radius, border-color, background-alt)
🟢 * Add - Text overrides (~140 strings) and entity translations with import/export
🟢 * Add - Entity links connecting blog posts to teams, players, games, and seasons
🟢 * Add - Custom logos with bulk manage (remove/re-fetch) and API overwrite protection
🟢 * Add - Per-sport configurable permalinks with collision-free hash slugs
🟢 * Add - Object cache integration with CDN-friendly immutable URLs and cache hash busting
🟢 * Add - Page cache support for 20+ caching plugins
🟢 * Add - Stale-while-revalidate pattern for aggregate stats with time-bucketed CDN URLs
🟢 * Add - Game peek hover cards (Floating UI) on game results across all templates
🟢 * Add - Automatic timezone conversion for visitor's local time
🟢 * Add - Theme template override system (child theme → parent theme → plugin)
🟢 * Add - Support for AllSportsAPI2, BasketAPI1, and BaseballAPI providers
🟢 * Add - 2 sports available (Basketball and Baseball) + 6 more coming soon