🎯 Need Help?

Get Premium Support

Priority assistance from the developer

⬆️ Upgrade

Unlock all features

More from ANWP

Sports Leagues Premium

Multi-sport league management with advanced statistics

Learn more β†’

AnWP SL Theme Kit

Starter themes & block patterns for Sports Leagues

Learn more β†’

Performance Optimization

Pro Feature

A slow Football Leagues page is almost always one of three things: standing tables being rebuilt on every load, live score requests hitting PHP instead of a cache, or the site having no object cache at all. This page covers each one, and how to find out which applies to you before changing anything.

🎯 Start here

SymptomLook at
High CPU during live games, even at low trafficLive scores and the REST API
A page with many standing tables is slowStanding tables
Every page is slow, logged in or outServer-side caching
You don’t know which part is slowFinding the slow block

Standing tables

A standing table is one of the more expensive things the plugin renders, and pages that show several at once (a 13-group World Cup, a conference league, a team page with two tables) pay for it on every load. Three mechanisms cut that cost. Two are automatic; one is a setting you switch on.

The render cache

Go to Settings & Tools > Settings > Display > Standing and set Cache rendered tables (seconds). The finished HTML of every standing table is then reused for that many seconds instead of being rebuilt on each page load.

The Cache rendered tables (seconds) field in Settings, Display, Standing, with its description
ValueEffect
0 (default)Off – every table is built from scratch on every load
3600Reuse the rendered table for one hour
86400Reuse for a day – fine for a finished season

Results are never stale, labels can be

This is the part worth understanding before you switch it on.

  • Recalculating a standing clears its cache immediately. Save a match, run a recalculation, or use the Recalculate bulk action, and the new numbers show at once, whatever the cache time.
  • Saving plugin settings clears it too. So a change to columns, zone colors or text strings takes effect right away.
  • Everything else waits for the timer. Renaming a club, swapping a logo, or editing a translation outside the plugin settings won’t appear until the cached copy expires.

Already running a page cache?

Leave the render cache off. If WP Rocket, LiteSpeed or similar already serves your pages from a full-page cache, the table isn’t being rendered on those requests anyway. It earns its keep on sites with logged-in visitors, live pages, or a page cache that gets bypassed.

The standing shortcodes take a cache attribute, which overrides the global setting for that one place. Use it to cache a heavy archive table while leaving the current season uncached:

[anwpfl-standing id="42" cache="86400"]
[anwpfl-standing id="99" cache="0"]

What happens automatically (PRO)

Nothing to configure for either of these.

  • Tab-at-a-time loading on competition pages. When a competition stage has several standing tables in tabs, only the table on the open tab is sent with the page. The rest arrive when a visitor opens their tab. On a ten-table stage that’s roughly 40 KB of standings instead of 326 KB.
  • Full tables on demand. A team or player page set to show a partial table (“Top rows”, “Around this team”) used to ship a hidden second copy of the whole table in case the visitor pressed Show full table. Now the button fetches it. On a team page with two tables that’s 56 KB instead of 198 KB.

Live scores and the REST API

This is the most common cause of high CPU on an otherwise healthy site: a few hundred visitors during a live game, each browser polling the live score endpoint, every request reaching PHP. The fix is to cache those responses at the edge rather than to reduce the polling.

Add a Cloudflare Cache Rule for /wp-json/anwpfl/v1/*. Only the versioned v1 namespace is safe to cache – admin endpoints deliberately sit outside it. Full walkthrough: Cache a WordPress REST API endpoint with Cloudflare.

Keep the default cache key

Do not enable “Ignore Query String” (the legacy Caching Level) or a custom cache key that drops the query string. Several endpoints put their state there – filters on layout blocks, the time bucket on live score endpoints. Ignoring it makes Cloudflare serve one cached response for every variant: the wrong filter shown on a click, and live scores frozen until the edge cache expires.

Server-side caching

  • Object cache – Redis or Memcached. The biggest single win on a data-heavy site, because it keeps repeated database reads out of PHP. If your host offers it, turn it on.
  • Full page caching – Nginx FastCGI caching or an equivalent, for logged-out visitors. See caching in SpinupWP for one example of the setup.
  • Bad bots – block them at Cloudflare. They generate real load on a site with thousands of player and match URLs.

Two habits also help: keep the plugin count modest, and prefer a lightweight SEO plugin over a resource-heavy one. If you need WooCommerce, consider running it as a separate WordPress instance.

Finding the slow block

Before optimizing anything, find out what’s actually costing the time. Turn on Block Performance Profiling under Settings > Advanced > Diagnostics with the Query Monitor plugin installed. Every template and layout block then reports its render time, memory use and query count to the Query Monitor panel.

Only administrators are measured, so visitors are never affected. Turn the standing render cache off while you measure, or you’ll be timing cache hits rather than real work.

πŸ†˜ Troubleshooting

I renamed a club and the table still shows the old name

Expected while the render cache is on – club renames are not one of the events that clear it. Wait for the cache time to pass, recalculate the standing, or clear the plugin cache under Settings & Tools > Toolbox > Clear Cache.

I am editing a table and want to see changes immediately

Set the cache to 0 while you work, then put it back. Saving the settings clears the cache in both directions, so the switch takes effect at once.

A standings tab opens empty or spins

The table for that tab is fetched over the REST API. If a security plugin, firewall or aggressive optimizer blocks REST requests from the front end, the fetch fails. See Page Optimizers.

Live scores are frozen or a filter shows the wrong data

Almost always a CDN cache key that drops the query string. See the warning above, and check the Cache Rule you added for /wp-json/anwpfl/v1/*.

πŸ“š Related