Proxy Cache Purge

Description

Cette extension n’installe pas ni ne configure un proxy de cache. Il sert d’interface avec ces services.

One common method of caching content for websites is via the use of reverse proxy caching. Common examples of this are Varnish and NGINX. These systems allow a website to update content and have the visitor’s experience cached without the need for complex plugins storing the files locally and using up a user’s disk space.

Un cache proxy inversé est installé devant un serveur et examine les requêtes. Si la page demandée est déjà mise en cache, elle fournit le contenu mis en cache. Sinon, elle génère la page et le cache à la demande.

The Proxy Cache Purge plugin sends a request to delete (aka flush) the cached data of a page or post every time it’s modified.

Comment cela fonctionne

Lorsque le contenu d’un site est mis à jour par WordPress, l’extension contacte le service de cache proxy avec l’URL de la page, demandant la suppression du cache.

Not all pages are deleted from the cache on every change. For example, when a post, page, or custom post type is edited, or a new comment is added, only the following pages will purge:

  • La page d’accueil
  • L’article/la page modifié/ée
  • Toutes les catégories, étiquettes et/ou taxonomies personnalisées associées à la page
  • Flux similaires
  • Pages API JSON associées

De plus, votre cache entier sera supprimé lors des actions suivantes :

  • Changement de thème
  • En appuyant sur le bouton Vider le cache dans la barre d’outils

Les extensions peuvent également s’accrocher aux actions de purge, pour filtrer leurs propres évènements afin de déclencher une purge.

Sur un réseau multisite utilisant des sous-dossiers, uniquement les administrateurs et administratrices de réseau peuvent purger le site principal.

Mode de développement

Si vous travaillez sur un site et devez désactiver la mise en cache de l’une des deux façons suivantes :

  1. Ajoutez define( 'VHP_DEVMODE', true ); à votre fichier wp-config.php
  2. Go to Proxy Cache -> Settings and enable Debug Mode for 24 hours at a time

Cela brisera le cache lors du chargement de la page. Ce n’est pas recommandé pour la production !

Cache Tags (BETA)

As of version 5.4.0, Proxy Cache Purge includes an optional Cache Tags / Surrogate Keys purge mode. This feature is marked as BETA and is disabled by default.

When enabled, the plugin:

  • Adds cache-tag headers to WordPress responses (for example, tagging pages by post ID, post type, taxonomy terms, author, and archives).
  • Uses tag-based purges instead of individual URL purges when content is updated, which can reduce purge traffic and improve consistency on complex sites.

Requirements:

  • A proxy cache that supports Cache Tags / Surrogate Keys and advertises this via standard Surrogate-Capability headers (for example, Surrogate-Capability: vhp="Surrogate/1.0 tags/1").

How to enable:

  • Go to Proxy Cache Settings Purge Method and check “Use Cache Tags (Surrogate Keys)”. The checkbox is only enabled when your cache tells WordPress it supports tags (or when you explicitly enable it via a define).
  • Alternatively, you can force-enable or force-disable detection via wp-config.php:

    define( ‘VHP_VARNISH_TAGS’, true ); // Force treat cache as tag-capable
    define( ‘VHP_VARNISH_TAGS’, false ); // Force treat cache as not tag-capable

Because this feature depends on your cache configuration, it is recommended that you test it carefully in staging before enabling it on production.

Background Purging with WP-Cron

On busy sites, sending many PURGE requests directly from admin requests can slow things down. When you define DISABLE_WP_CRON as true in wp-config.php (because you are running a real system cron that calls wp-cron.php), Proxy Cache Purge automatically switches to an asynchronous mode:

  • Purge requests (both URL-based and tag-based, when Cache Tags are enabled) are collected into a small per-site queue.
  • The queue is processed by WP-Cron in the background, keeping your admin and content-editing actions responsive even when many URLs or tags must be invalidated.

Object-cache purges (the « Purge Database Cache » option) remain synchronous and are not affected by this behaviour. The Proxy Cache settings page and Site Health integration expose basic queue status so you can verify that background purging is healthy; if the queue appears large or very old, check that your system cron is correctly invoking WordPress cron.

Important: Cron Frequency and Cache Freshness

When using background purging, the frequency of your system cron determines how quickly cache invalidations are processed. The longer the interval between cron runs, the longer visitors may see stale content after updates.

For minimal stale content, run your system cron every minute:

* * * * * /usr/bin/php /var/www/html/wp-cron.php

If you can tolerate slightly longer delays, every 2-5 minutes is also acceptable. However, running cron less frequently (e.g., every 15 minutes) means cache purges may be delayed by that amount after content changes.

Note: Scheduled posts are handled specially. When a scheduled post is published via WP-Cron, the cache is purged synchronously within the same cron run, ensuring immediate cache invalidation without waiting for the next cron execution.

For detailed instructions on setting up a proper Linux-based WordPress cron, see: WordPress Cron Optimization.

Disabling Background Purging

If you have DISABLE_WP_CRON defined but do not want background purging (for example, on low-traffic sites where immediate purges are preferred), you can force-disable cron-based purging by adding this to your wp-config.php:

define( 'VHP_DISABLE_CRON_PURGING', true );

With this constant set, all cache purges will execute immediately during the request, regardless of the DISABLE_WP_CRON setting.

WP-CLI

Purge

Les commandes Purge vous permettent de vider le cache.

  • wp varnish purge – Flush the entire site cache (equivalent to clicking « Empty Cache » in admin)
  • wp varnish purge --all – Explicitly flush the entire site cache
  • wp varnish purge <url> – Flush cache for a specific URL and all content below it (wildcard)
  • wp varnish purge <url> --url-only – Flush cache for only the exact URL specified (no wildcard)
  • wp varnish purge --tag=<tag> – Flush cache by tag (requires Cache Tags mode to be enabled)

Examples:

  • wp varnish purge – Purge entire site
  • wp varnish purge --all – Same as above, more explicit
  • wp varnish purge https://example.com/hello-world/ – Purge this URL and everything below it
  • wp varnish purge https://example.com/hello-world/ --url-only – Purge only this exact URL
  • wp varnish purge https://example.com/wp-content/themes/ --wildcard – Purge all theme files
  • wp varnish purge --tag=p-123 – Purge all pages tagged with post ID 123
  • wp varnish purge --tag=pt-post – Purge all cached pages of post type « post »

Debug

Le débogage peut vous aider à comprendre pourquoi votre cache ne fonctionne pas aussi bien qu’il le pourrait. La valeur par défaut est pour votre page d’accueil, mais vous pouvez tester n’importe quelle URL sur votre domaine.

  • débogage de wp varnish [<url>]

Paramètres disponibles :

  • [--include-headers] — Inclure les en-têtes dans la sortie de vérification de débogage
  • [--include-grep] — Répertoires de thèmes et d’extensions actifs de Grep pour les problèmes courants

DevMode

Le mode développement vous permet de désactiver temporairement le cache.

  • wp varnish devmode [<activate|deactivate|toggle>] – Modifier l’état du mode de développement

Async purge queue (cron-mode)

When you define DISABLE_WP_CRON as true and run a real system cron for WordPress, Proxy Cache Purge can move heavy purge work into a small background queue that is processed by WP‑Cron.

You can inspect and manage that queue via WP‑CLI:

  • wp varnish queue status – show whether cron-mode is active, if a full purge is queued, counts of queued URLs/tags, and the last queue run time.
  • wp varnish queue process – process any items currently in the queue (useful to run after deploys or cache‑sensitive operations).
  • wp varnish queue clear – clear the queue without sending any PURGE requests.

These commands do not replace your normal WordPress cron (you still need a cron entry that calls wp cron event run --due-now or hits wp-cron.php), but they give you a simple operational handle when using cron‑mode.

Understanding Purge Behavior

There are different types of cache purges, and they behave differently:

Manual Purges (Admin Bar)

  • « Purge Cache (All Pages) » – Sends a single regex purge request to invalidate the entire cache. Always executes immediately.
  • « Purge Cache (this page) » – Purges only the exact URL you’re viewing. Always executes immediately.

Manual purges are always immediate, even when background cron-mode is enabled. This is intentional: when you click a button, you expect immediate results.

Automatic Purges (Post Save/Update)

When you save or update a post, the plugin automatically purges:

  • The post’s URL
  • The homepage
  • Category archive pages
  • Tag archive pages
  • Author archive page
  • Date-based archives
  • RSS feeds
  • Related REST API endpoints

This can be 20-50+ URLs depending on your site structure. When cron-mode is enabled, these automatic purges are queued and processed in the background to avoid slowing down the post editor.

Key Difference

Action
URLs Purged
Uses Cron Queue?

« Purge Cache (All Pages) »
1 (regex)
No – always immediate

« Purge Cache (this page) »
1
No – always immediate

Post save/update
20-50+
Yes (if cron-mode enabled)

If you need to immediately purge all URLs related to a specific post (not just the post URL), save the post – the automatic purge will handle all related URLs.

Captures d’écrans

  • Bouton de purge sur « Immédiatement » (administrateur du Tableau de bord)
  • Menu de la barre d’outils (avec le cache activé)
  • Menu de la barre d’outils (avec le cache désactivé)
  • Résultats du scanner
  • Modifier l’adresse IP du proxy
  • Activer le mode développement
  • Avertissement de mode de développement (préavis de 24 heures)

Installation

Aucune instruction spéciale ne s’applique.

Si vous disposez d’un service proxy tiers (tel que Sucuri ou Cloudflare), vous devrez ajouter une adresse IP sur le Cache proxy -> page Réglages. Vous pouvez également ajouter une définition à votre fichier wp-config.php : define('VHP_VARNISH_IP','123.45.67.89');

When using NGINX based proxies, your IP will likely be localhost.

Prérequis

  • Jolis permaliens activé
  • A server based proxy cache service (such as Varnish or NGINX)

FAQ

Veuillez signaler tous les problèmes sur forum de support

If you have code patches, pull requests are welcome.

Vous ne travaillez pas chez DreamHost ? Est-ce officiel ou DreamHost uniquement ?

This plugin was originally adopted and updated for DreamHost’s DreamPress server, however it is not (and never has been) for DreamHost only.

I worked at DreamHost from 2012 to 2022, and have maintained the plugin since around 2014 or so.

As of October 2023, this plugin is NO LONGER installed by default on DreamPress.

Today, the plugin is maintained by GetPageSpeed, with a focus on advanced NGINX and proxy caching deployments and strong compatibility with the NGINX cache-purge module from the NGINX Extras collection.

Cette extension met-elle en cache mes données ?

Non. Cette extension informe votre système de cache lorsque le contenu est mis à jour et supprime les données mises en cache à ce moment-là.

Pourquoi l’extension ne supprime-t-elle pas automatiquement tout le cache ?

Speed and stability. Emptying too much of a cache on every change can slow a server down. This plugin does its best to determine what needs to be deleted and when, while providing hooks for developers to use as necessary.

How many cached files are deleted when a post is updated?

It depends on the post, but in general the tool will delete cached content for:

  1. The post name
  2. The front page of the site
  3. All first pages of related tags/categories
  4. The JSON API pages
  5. All related RSS feeds

Is there a limit to how many pages I can purge at once?

Not really, but in order to prevent your site from crashing by running the same checks over and over, if you try to purge more than 50 URLs at once, the plugin will do a full purge. Normally this never happens, but there are some plugins that hook into the options to add more pages to purge on an update.

You can change this value in your settings, or via the define VHP_VARNISH_MAXPOSTS in your wp-config.php file.

Keep in mind, the count of 50 does not include category/tags, API, or RSS pages. It’s just the sheer number of individual posts/pages you’re trying to purge at once.

Can I prevent purges for drafts or other post statuses?

Yes. If your environment doesn’t cache logged-in users and you want to avoid purge noise from autosaves/drafts, you can exclude specific statuses network‑wide via wp-config.php (multisite‑friendly).

Add a define to exclude drafts:

define( 'VHP_EXCLUDED_POST_STATUSES', 'draft' );

Exclude multiple statuses (comma‑separated):

define( 'VHP_EXCLUDED_POST_STATUSES', 'draft,pending' );

Or pass an array:

define( 'VHP_EXCLUDED_POST_STATUSES', array( 'draft', 'pending' ) );

Developers can also use a filter to adjust the valid statuses programmatically:

add_filter( 'varnish_http_purge_valid_post_statuses', function( $statuses, $post_id ) {
    return array_diff( $statuses, array( 'draft' ) );
}, 10, 2 );

By default, the plugin considers these statuses for purge URL generation: publish, private, trash, pending, draft.

Puis-je supprimer la totalité du cache ?

Oui. Cliquez sur le bouton « Vider le cache » sur le Tableau de bord « Immédiatement » (voir la capture d’écran si vous ne le trouvez pas). Il y a aussi un bouton « Vider le cache » sur la barre d’outils d’administration.

Si vous ne voyez pas de bouton, votre compte ne dispose pas des autorisations appropriées. Seuls les administrateurs/administratrices peuvent vider l’intégralité du cache. Dans le cas d’un réseau multisite sous-dossier, seuls les administrateurs/administratrices réseau peuvent vider le cache du site principal.

L’extension supprimera-t-elle mon cache lorsque je modifierai des fichiers sur le serveur ?

Non. WordPress ne peut pas détecter ces changements de fichiers de sorte qu’il ne peut pas dire à votre cache quoi faire. Vous devrez utiliser les boutons Vider le cache lorsque vous aurez fini de modifier votre code.

Est-ce que toutes les extensions et thèmes WordPress fonctionnent avec un cache proxy ?

No. Some of them have behaviours that cause them not to cache, either by accident or design. It’s incredibly hard to debug those, since many of the related issues are contextual (like if you save a page with a special setting). I’ve done my best to flag everything as possible issues with the debugger.

Je suis développeur/développeuse, puis-je dire à votre cache de se vider dans mon extension/thème ?

Yes. Full documentation can be found on Custom Filters in the wiki.

Puis-je désactiver la mise en cache ?

Not permanently, and remember that this plugin is not actually caching your content.

You can use development mode to have WordPress attempt to tell your proxy service not to serve cached content, but the content will still be cached by the service.

Il y a trois façons de faire ceci :

  1. Choose ‘Pause Cache (24hrs)’ from the Cache dropdown menu in your toolbar
  2. Accédez aux réglages du cache proxy -> et activez le mode de développement
  3. Ajouter define( 'VHP_DEVMODE', true ); à votre fichier wp-config.php.

The first two options will enable development mode for 24 hours. If you’re working on long term development, you should use the define.

It is not recommended you use development mode on production sites for extended periods of time, as it will slow your site down and lose all the benefits of caching in the first place.

Pourquoi le bouton de redémarrage du cache est-il manquant ?

Si vous avez désactivé la mise en cache via le define, vous ne pouvez pas redémarrer le cache via l’extension. Vous devrez changer define( 'VHP_DEVMODE', true ); en define( 'VHP_DEVMODE', false ); dans votre wp-config.php fichier.

L’extension supprimera-t-elle mon cache lorsque j’éditerai des fichiers sur le serveur ?

En raison des dommages que cela peut causer à un site, l’accès est limité aux administrateurs uniquement. Dans le cas d’un réseau multisite, seuls les administrateurs réseau peuvent désactiver la mise en cache et ils doivent le faire via wp-config.php pour des raisons de sécurité.

Pourquoi est-ce que je vois toujours du contenu mis en cache en mode développement ?

While development mode is on, your server will continue to cache content but the plugin will tell WordPress not to use the cached content. That means files that exist outside of WordPress (like CSS or images) may serve cached content.

The plugin does its best to add a No Cache parameter to javascript and CSS, however if a theme or plugin doesn’t use proper WordPress enqueues, then their cached content will be shown.

Pourquoi puis-je encore vider le cache en mode développement ?

Because the server is still caching content.

The plugin provides a way to flush the cache for those pages, as well as anything not included in WordPress, for your convenience.

Comment puis-je savoir si tout est en cache ?

From your WordPress Dashboard, go to Proxy Cache > Check Caching. There, a page will auto-scan your front page and report back any issues found. This includes any known problematic plugins. You can use it to scan any URL on your domain.

Pourquoi rien n’est-il mis en cache lorsque j’utilise PageSpeed ?

PageSpeed aime mettre des en-têtes Caching pour dire de ne pas mettre en cache. Pour corriger ce problème, vous devez mettre ceci dans votre section .htaccess pour PageSpeed : ModPagespeedModifyCachingHeaders off

Si vous utilisez NGINX, c’est pagespeed ModifyCachingHeaders off;

Pourquoi mes modifications ne s’affichent-elles pas lorsque j’utilise CloudFlare ou un autre proxy ?

Lorsque vous utilisez CloudFlare ou tout autre service similaire, vous avez mis un proxy devant le proxy du serveur. En général, ce n’est pas une mauvaise chose, même si cela peut introduire une certaine latence du réseau (cela signifie que votre site peut fonctionner plus lentement car il doit traverser plusieurs couches pour accéder au contenu). Le problème survient lorsque WordPress essaie d’envoyer la demande de purge à votre nom de domaine et, avec un proxy, cela signifie le service proxy et non votre site web.

Sur un site unique, vous pouvez le modifier via le Cache proxy > Vérifiez la page mise en cache. Sur multisite, vous devrez ajouter ce qui suit à votre fichier wp-config.php : define('VHP_VARNISH_IP','123.45.67.89');

Remplacez 123.45.67.89 par l’adresse IP de votre serveur de cache proxy (pas CloudFlare). NE PAS mettre http dans cette définition. Si vous êtes sur nginx, vous voudrez utiliser localhost au lieu d’une adresse IP.

If you want to use WP-CLI, you can set an option in the database. This will not take precedence over the define, and exists for people who want to use automation tools: wp option update vhp_varnish_ip 123.45.67.89

Pourquoi mes articles expirent/ne s’affichent-ils pas lorsque j’utilise CloudFlare ?

This is usually related to CloudFlare’s APO setup.

I have an open ticket with CloudFlare trying to debug this, but basically whatever they’re doing with APO doesn’t ‘like’ the flush command and times out (or crashes).

Pourquoi est-ce que j’obtiens une erreur 503 ou 504 à chaque mise à jour d’un article ?

Votre adresse IP est incorrecte. Vérifiez l’adresse IP de votre serveur, puis le réglage de l’adresse IP de votre cache proxy. S’ils ne sont pas identiques, c’est probablement pour cette raison.

Comment trouver la bonne adresse IP ?

Your proxy IP must be one of the IPs that the service is listening on. If you use multiple IPs, or if you’ve customized your ACLs, you’ll need to pick one that doesn’t conflict with your other settings.

Par exemple, si votre cache proxy écoute sur une IP publique et privée, choisissez la privée. D’autre part, si vous avez demandé à Varnish d’écouter sur 0.0.0.0 (p. ex. « écouter sur toutes les interface possibles »), vous devrez vérifier quelle IP vous définissez commme votre ACL de purge pour autoriser (généralement 127.0.0.1 c’est à dire localhost), et l’utiliser (p. ex. 127.0.0.1 ou localhost).

Si votre hébergeur a configuré votre service, vérifiez sa documentation.

Que faire si j’ai plusieurs adresses IP de cache proxy ?

Vous pouvez les saisir, séparés par une virgule, sur la page des réglages.

Quelle version de Varnish est prise en charge ?

So far this plugin has been reported to successfully function on Varnish v2 through v6.5.

Does this work with NGINX caching?

It can, if you’ve configured NGINX caching to respect the curl PURGE request.

If this doesn’t work, try setting your Varnish IP to localhost as NGINX requires a service control installed for the IP address to work.

Quelles devraient être mes règles de cache ?

This is a question beyond the support of this plugin. I do not have the resources available to offer any configuration help. Here are some basic gotchas to be aware of:

  • Pour vider les données mises en cache, le service devra respecter la commande PURGE
  • Tous les services de cache ne configurent pas PURGE par défaut
  • Lors du vidage de l’ensemble du cache, l’extension envoie une commande PURGE de /.* et définit l’en-tête X-Purge-Method comme regex
  • NGINX expects the IP address to be ‘localhost’

How do I pass a Varnish control key or auth header?

Some providers require a control key, token, or Authorization header to accept PURGE requests. You can set a header name and value via the settings page or via the following constant:

define( 'VHP_VARNISH_EXTRA_PURGE_HEADER', 'X-Control-Key: YOUR_CONTROL_KEY_HERE' );

Alternatively, you can inject any required header via a filter.

  1. Set where PURGE requests should be sent (host:port, no scheme):

    define( ‘VHP_VARNISH_IP’, ‘varnish.example.com:6081’ );

  2. Add your control key/auth header via a small MU plugin so it loads on every request. Create wp-content/mu-plugins/varnish-purge-auth.php with:

    <?php
    add_filter( ‘varnish_http_purge_headers’, function( $headers ) {
    // Example: provider expects a custom key header
    $headers[‘X-Control-Key’] = ‘YOUR_CONTROL_KEY_HERE’;

    // Or use Authorization headers:
    // $headers['Authorization'] = 'Basic ' . base64_encode( 'username:password' );
    // $headers['Authorization'] = 'Bearer ' . 'YOUR_TOKEN_HERE';
    
    return $headers;
    

    } );

If your provider requires HTTPS for the purge endpoint, force the schema:

add_filter( 'varnish_http_purge_schema', function() { return 'https://'; } );

Important: This plugin sends HTTP PURGE requests to your cache service. It does not use the Varnish management interface (varnishadm/secret on port 6082).

Comment puis-je voir ce que l’extension envoie au service de cache ?

Yes IF the service has an interface. Sadly NGINX does not. Detailed directions can be found on the debugging section on GitHub. Bear in mind, these interfaces tend to be command-line only.

Caching is detected but cannot be confirmed. What does that mean?

It means that somewhere your server’s headers aren’t returning the data the plugin needs to see, in order to determine if the cache is working. The most common cause is that your server isn’t returning the X-Varnish header or the Age header.

I have renamed X-Varnish header for security reasons and Site Health Check says no cache service

You can use varnish_http_purge_x_varnish_header_name filter to customize this header name, like below to resolve this:

function change_varnish_header( $default_header ) {
    return 'My-Custom-Header'; // Replace with the desired header
}
add_filter( 'varnish_http_purge_x_varnish_header_name', 'change_varnish_header' );

Avis

4 février 2026
I had lot of problems with cache but this solved them! Thank you.
1 mai 2025
The plugin simply works even for all types of cache servers. Only one things bothers me about this plugin is its support for PHP 5.6+ where core itself doesn’t support upto php 7.1 while WordPress recommends using PHP 7.4+. So, this plugin should be compatible with PHP 7.4+. Using newer php code is good for security and performance while deprecated codes might produce venerability!
5 septembre 2023 2 réponses
Spent most of the day working on getting this working with a remote NGINX reverse proxy. The plug-in keeps complaining about no age header in the response. Google seems to suggest that etags and age headers no longer supported in dynamic content with NGINX. Plug-in help is of no help on what header the plug in is expecting to see in order to work. removed. Will have to keep deleting the cache the old manual way.
6 avril 2023
No complaints, it’s been working perfectly for years. Need it very, very seldom — but when I do need it it works. When I don’t need it? It’s out of the way and doesn’t advertise itself overmuch, like some of the other plugins I’ve used over time.
Lire les 26 avis

Contributeurs/contributrices & développeurs/développeuses

« Proxy Cache Purge » est un logiciel libre. Les personnes suivantes ont contribué à cette extension.

Contributeurs

“Proxy Cache Purge” a été traduit dans 6 locales. Remerciez l’équipe de traduction pour ses contributions.

Traduisez « Proxy Cache Purge » dans votre langue.

Le développement vous intéresse ?

Parcourir le code, consulter le SVN dépôt, ou s’inscrire au journal de développement par RSS.

Journal des modifications

5.6.4 (2026-01)

  • New: Added VHP_DISABLE_CRON_PURGING constant to force-disable background purging even when DISABLE_WP_CRON is enabled. Useful for low-traffic sites that use external cron but prefer immediate cache purges.

5.6.3 (2026-01)

  • Fix: Manual cache purge actions now execute immediately regardless of WP-Cron mode. Previously, « Purge Cache All Pages » and « Purge This Page » were queued when DISABLE_WP_CRON was enabled.

5.6.2 (2026-01)

  • Fix: Cacheability Pro recommendation moved to dismissable admin notice

5.6.0 (2026-01)

  • New: Added recommendation for Cacheability Pro cache warming plugin on settings page.

5.5.3 (2025-12)

  • New: End-to-End Cache Test in « Check Caching » admin page – a comprehensive 7-step test that verifies both caching AND purging work correctly, without relying on header detection heuristics.
  • Fix: Header Analysis tab now stays active after running a URL scan.
  • Fix: Removed duplicate introductory text in Header Analysis tab.

5.5.2 (2025-12)

  • Fix: Removed development files from WordPress.org distribution.
  • Fix: Added concurrency control to CI workflows to prevent SVN deploy race conditions.

5.5.1 (2025-12)

  • New: WP-CLI --all flag for explicit full site cache purge.
  • New: WP-CLI --url-only flag to purge exact URL without wildcard matching.
  • New: WP-CLI --tag=<tag> option for tag-based cache purging (requires Cache Tags mode).
  • Doc: Fixed WP-CLI documentation – wp varnish purge correctly documented as full site purge.
  • Doc: Fixed « WP CLI » typo to « WP-CLI ».
  • Dev: Added PHPCS/PHPStan linting infrastructure and GitHub Actions CI.
  • Dev: New pytest coverage for WP-CLI purge command variants.

5.5.0 (2025-12)

  • Fix: Scheduled posts now properly purge cache when auto-published via WP-Cron. Previously, purges were queued but not processed until the next cron run, leaving stale content.
  • New: Added transition_post_status hook to handle future publish transitions synchronously, ensuring immediate cache invalidation for scheduled posts.
  • New: Shortlink URLs (?p=XXX) are now purged when scheduled posts publish, clearing any cached 404 responses.
  • Doc: Added guidance on cron frequency for background purging mode – recommends every-minute cron for minimal stale content.
  • Dev: New pytest coverage for scheduled post publishing via WP-Cron.

5.4.0 (2025-12)

  • New (BETA): Optional Cache Tags / Surrogate Key purge mode, controlled via the « Use Cache Tags » setting.
  • New (BETA): Tag-mode enablement based on standard Surrogate-Capability headers from surrogates (Edge Architecture spec) or the VHP_VARNISH_TAGS wp-config define.
  • New: Admin UI improvements – properly associated labels for checkboxes and clearer explanatory copy.
  • Dev: Test VCL and pytest stack updated to cover tag-based purging behaviour.

5.3.0 (2025-09)

  • New: VHP_EXCLUDED_POST_STATUSES define to exclude statuses (e.g. drafts) from purge triggers.
  • New: varnish_http_purge_valid_post_statuses filter to customize statuses programmatically.
  • Fix: REST URL generation for tags and custom taxonomies; respect rest_base and use term IDs.
  • Fix: Avoid booleans in generated URL lists for REST entries.
  • Fix: Correct WP version check (pre-4.7 only) for deactivation logic.
  • Fix: Correct per-host IP loop in purge header filtering.
  • Fix: Properly strip query strings when deduplicating purge URLs.
  • Fix: Debugger wp_remote_get args and header checks (Via header scalar/array).
  • Polish: Typo fix in DevMode settings message.

5.2.2 (2024-08)

  • Fix: Warning / Notices resolved.

5.2.1 (2024-01)

  • New: Allow custom X-Varnish header name.

5.2.0 (2023-07)

  • Fix: Debug if Via headers are an array.