A simple solution could be to check when you click the “empty all cache” Button with $_GET
Like this:
function wpse_16722_purge_varnish() {
// Is the button submitted, Get the value
$purge = isset( $_GET['w3tc_note'] ) ? trim( $_GET['w3tc_note'] ) : '';
// Security-check, user can edit settings
// And the button "Empty all cache" is submitted
if( current_user_can('manage_options') && $purge == 'flush_all' ) {
// Maybe there is a better way to clear the cache
// in varnish, i found this on php.net
// Change this to match your Varnish-setup
$fp = fsockopen( "127.0.0.1", "80", $errno, $errstr, 2 );
if ( ! $fp ) {
echo = "$errstr ($errno)<br />\n";
} else {
$out = "PURGE /alain HTTP/1.0\r\n";
$out .= "Host: giantdorks.org\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite( $fp, $out );
while ( ! feof( $fp ) ) {
echo fgets( $fp, 128 );
}
fclose( $fp );
}
}
}
add_action('admin_head', 'wpse_16722_purge_varnish');
The Varnish Configuration Language (VCL) also has the url purging function. It’s accessible via the purge_url(url_pattern) function.
acl purge_acl {
"localhost";
"some.hostname.ext";
"154.120.2.33";
}
sub vcl_recv {
if(req.request == "flush_all") {
if(!client.ip ~ purge_acl) {
error 405 "Not allowed";
} else {
purge_url(req.url);
error 200 "Purged";
}
}
}
The script above has the normal proxy/cache behaviour for request methods like GET & POST. But when a user connects via the “flush_all” method, the page is purged.