Site search

Search IndexLane

Type at least two characters to search.

    Technical note

    WordPress TTFB increased after an update: what to check

    Separate cache hits from misses, repeat the same requests, and identify whether the slowdown comes from WordPress, the CDN, or the connection.

    By NikoPublished April 1, 2026Updated September 5, 2026Read 4 min
    TTFB cache proof matrix separating confirmed edge hits, misses, bypasses, browser rendering, and origin generation.
    Matrix separating edge hits, misses, bypasses, browser rendering, and origin generation.

    When WordPress becomes slow after a plugin, theme, or cache change, first check whether the slow request reaches WordPress. A cached response and a page generated by PHP are different tests. Mixing them can make a cache problem look like a hosting problem.

    TTFB measures the time until the first response byte and can include connection setup, redirects, and server work. It is not a Core Web Vital. The web.dev TTFB reference gives 0.8 seconds as a rough guide, not a universal pass/fail boundary.

    Keep the test conditions consistent

    Record these details before comparing results:

    DetailWhat to record
    Page typeHomepage, product, post, archive, logged-in route, API, or another specific class
    Test locationSame region/network for before and after
    Request stateAnonymous, cookie-bearing, logged-in, cache-bypass, or preload
    Cache resultVerified HIT, MISS, BYPASS, EXPIRED, or unknown from real headers
    Website versionCommit/plugin/theme/config version and deployment time
    Sample sizeEnough repeated requests to report p50 and p95, not one fastest request

    Do not add a random query string and call it “cold” unless the production cache key treats that request like a real miss. Do not call the second request “warm” unless headers prove a cache hit.

    Measure cache hits and misses separately

    For each sample page:

    1. Record headers and timings for an anonymous request.
    2. Repeat without changing URL, cookies, location, or protocol.
    3. Identify cache status and age from the actual response headers.
    4. Collect a distribution for confirmed hits and confirmed misses separately.
    5. Compare the same conditions before and after the change. If no earlier measurements exist, say so; do not present a different page or cache state as the baseline.
    6. Profile origin generation only on requests proven to reach origin.

    This command saves the headers and prints timings for one request:

    curl -sS -o /dev/null -D headers.txt \
      -w 'remote=%{remote_ip} code=%{http_code} redirect=%{time_redirect} connect=%{time_connect} tls=%{time_appconnect} starttransfer=%{time_starttransfer} total=%{time_total}\n' \
      https://example.com/representative-page
    

    Repeat the request and group timings by the cache headers. The command measures one test location; it does not measure the experience of all visitors.

    Use the pattern to choose the next check

    What changedWhere to look nextWhat to compare
    Confirmed edge HIT regressedCDN route, cache storage, edge worker, connection pathSame POP/request state; HIT header; response age; timing distribution
    MISS slow, HIT stableOrigin generation or cache-fill pathMISS header plus origin/app timing
    HIT rate collapsedCache key, cookies, bypass rule, invalidation, TTLHeader distribution before/after and named rule change
    Anonymous fast, cookie-bearing slowPage-cache bypass, personalization, session/plugin behaviorSame URL/location; cookie set recorded; cache status differs
    Origin generation regressedPHP, database, object cache, theme/plugin hooks, remote callsConfirmed misses plus profiling or query/request evidence
    Only browser rendering regressedFrontend assets or JavaScript, not document TTFBDocument TTFB stable; later browser milestones changed

    If the slow requests reach WordPress, inspect:

    • database query count and slow queries
    • uncached remote HTTP calls
    • plugin/theme hooks on the request path
    • object-cache hit behavior and key invalidation
    • cron or queue work leaking into requests
    • full-page cache exclusions and cookies

    Before/after worksheet

    SampleVersionRequest stateCache headersRequestsMedian TTFBp95 TTFBNotes
    Product controlBeforeAnonymousHeader/value
    Product affectedBeforeAnonymousHeader/value
    Product controlAfterAnonymousHeader/value
    Product affectedAfterAnonymousHeader/value

    Repeat the same measurements after the fix and compare the median and slower requests, not only the fastest result. If document TTFB stayed stable but rendering became slower, inspect frontend assets and JavaScript. A browser-only tag runs after the document starts arriving, so it does not explain a slower server response for that document.

    Related notes

    WordPress SEO checks after a plugin or theme update

    Check canonicals, robots tags, redirects, and cache behaviour after a WordPress update. Compare affected templates with pages that still work.

    Read article →

    Cloudflare serves an old page: check the cache before purging

    Compare the public page with the origin response to find stale cache entries, unsuitable cache rules, and headers that prevent reuse.

    Read article →