AnWP Tennis Leagues is for clubs, academies, federations and amateur leagues that run their own racket-sport competitions. You enter the players and the results. The plugin keeps the draws, tables and player records, and puts them on your site.
6 sports, scored properly
- Tennis and padel score in sets of games, with tiebreaks, no-ad, golden point, a 10-point final-set tiebreak or a match tiebreak as the decider.
- Squash, table tennis, pickleball and badminton score in games to 11, 15 or 21, won by 2, with badminton capped at 30.
- A score that couldn’t happen under the match’s rules is refused, and the message names the set it’s in. 8-6 in a set with a tiebreak won’t save.
- Six match statuses: Scheduled, Finished, Retired, Walkover, Default and Cancelled. The winner of a finished match is worked out from the score.
- Team ties, for club leagues played over 1 to 9 rubbers.
- Each match keeps a copy of the rules it was created under, so changing a competition later doesn’t rewrite matches that already exist.
Competitions and draws
- Players, doubles pairs, clubs and their courts, with surfaces and indoor courts.
- Competitions with seasons. A new competition comes with this year’s season and a draw, ready to use.
- A setup wizard: your sport, one club or several, and a first competition with its draw. Sample data for tennis, padel and pickleball shows the pages filled in, and comes off again from the Dashboard.
- Knockout draws: one click generates the bracket, with seeds on the ITF placement lines and byes to the top seeds, up to 128 lines. Winners move on by themselves. Add a 3rd place match if you want one.
- Round robin and group draws: one click writes every fixture, round by round. A box of 6 gets 15 matches in 5 rounds.
- League tables that rebuild themselves when a result changes. Set the points, and put the tiebreakers (wins, head-to-head, % sets won, % games won) in your own order.
- A Dashboard that shows what needs you first: tables out of date, draws waiting for a bracket, matches overdue.
- Single-club mode for a club running its own site.
On your site
- Match pages with the score set by set, and a preview before and during the match: last 5 results, head-to-head, recent workload.
- Player and pair pages with the last 10 results, match and set profiles, year by year by surface, and rivalries, all counted from your own matches.
- Competition pages with season pills and a tab per draw. A knockout shows as a bracket that fits narrow screens, a round robin as its league table.
- Printable sheets for the club noticeboard: the draw, the round-robin grid and the day’s order of play.
- A match list with a 7-day strip, a date picker and All / Live / Finished / Upcoming pills. It swaps content in place with JavaScript on, and every control is a plain link with it off.
- 4 shortcodes and 4 blocks: draw, match list, standings table and player card. A Shortcodes page builds them from pickers and previews them in your theme.
- Built from div grids, so your theme’s table and list styles don’t leak in. Copy any template into your theme to change it.
- Change 39 of the words your public pages print under Settings > Text.
- Search engines: bye matches and empty bracket slots stay out of the index and the sitemap, and filtered views point to the plain page. Works with Yoast SEO and Rank Math.
- Page cache clearing: when a match changes, its page and the pages around it are cleared. Works with W3 Total Cache, LiteSpeed Cache, SpinupWP, SiteGround Optimizer, FlyingPress, Hummingbird, WP Rocket, WP Fastest Cache and WP Super Cache.
- A read-only public REST API under
anwptl/v1 for matches, competitions, players, pairs, clubs and standings.
Source code
Every minified file ships next to its unminified build: admin/js/admin-core.js beside admin-core.min.js, public/js/tl-public.js beside tl-public.min.js, gutenberg/blocks.js beside blocks.min.js, and the same for every stylesheet. The admin screens are Vue 3 single-file components built with Vite, the public scripts are plain JavaScript modules bundled with Vite, the blocks are built with @wordpress/scripts, and the stylesheets are compiled from SCSS.
Third-party code
All of it is bundled locally, and nothing is loaded from a CDN.
- Vue 3.5.42 (MIT), https://github.com/vuejs/core – admin screens, in
admin/js/admin-core.js.
- Pinia 3.0.4 (MIT), https://github.com/vuejs/pinia – admin screens.
- vue-multiselect 3.5.0 (MIT), https://github.com/shentao/vue-multiselect – admin pickers.
- vue-draggable-plus 0.6.1 (MIT), https://github.com/Alfred-Skyblue/vue-draggable-plus, with SortableJS 1.15.2 (MIT), https://github.com/SortableJS/Sortable – drag-to-order rows in the admin.
- Country flags: HatScripts/circle-flags (https://github.com/HatScripts/circle-flags), MIT licence –
public/img/flags.svg.
Privacy
The plugin makes no remote requests and sends no data anywhere: no tracking, no telemetry, no cookies. Everything you enter stays in your own database. A player’s date of birth is never printed on a public page or returned by the public REST API – player and match pages show the age in years. When a match changes, the plugin asks the page cache plugin you already run to clear the pages around it. What that plugin does next is up to its own settings.
Documentation
Guides for each sport, draws, fixtures and standings: anwp.pro/docs/tennis-leagues