1

Ok. I'm really stumped on this one.

Basically, I need to call a function for the Wordpress plugin W3 Total Cache as part of a cron job in crontab. I'd like to automatically clear the entire page cache nightly.

Here's the code that works fine within wordpress that I need to call:

if (function_exists('w3tc_pgcache_flush')) { w3tc_pgcache_flush(); } 

I'm currently using the following script:

#!/usr/bin/php <?php define('DOING_AJAX', true); define('WP_USE_THEMES', false); $_SERVER = array( "HTTP_HOST" => "http://example.com", "SERVER_NAME" => "http://example.com", "REQUEST_URI" => "/", "REQUEST_METHOD" => "GET" ); require_once('/path-to-file/wp-load.php'); wp_mail('[email protected]', 'Automatic email', 'Hello, this is an automatically scheduled email from WordPress.'); if (function_exists('w3tc_pgcache_flush')) { w3tc_pgcache_flush(); } ?> 

and the command line:

php -q /path-to-file/flushtest.php 

I used the wp_mail function to test and make sure I'm getting something.

The script is working fine except that the page cache is never flushed. I get the email and there aren't any errors in the log either.

Any ideas?

Thanks for your help.

1
  • Was my answer helpful here? Commented Feb 17, 2012 at 16:14

1 Answer 1

3

Here's how I would go about doing this:

First create a file with a hash for the file name within your theme directory - this one is md5('foobar'):

3858f62230ac3c915f300c664312c63f.php 

Within that file would be something like this:

//Use the file name as an API key of sorts $file = explode('.', basename(__FILE__)); $key = $file[0]; //Trigger the WP function - corresponds to the foo_w3tc_flush_cron() function define('FOO_W3TC_FLUSH', true); define('FOO_W3TC_FLUSH_KEY', $key); //Set headers Header('Cache-Control: no-cache'); Header('Pragma: no-cache'); //Set W3TC Constants define('DONOTMINIFY', true); define('DONOTCACHEDB', true); define('DONOTCACHEPAGE', true); //Set WP Constants define('DOING_AJAX', true); //Load WP if(file_exists($_SERVER['DOCUMENT_ROOT'].'/wp-load.php')) require_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php'); die(); 

Add a function to your functions.php file similar to the following:

$api_key_plaintext = 'foobar'; define('FOO_W3TC_FLUSH_API_KEY', md5($api_key_plaintext)); add_action('plugins_loaded', 'foo_w3tc_flush_cron', 1); function foo_w3tc_flush_cron(){ $update = FOO_W3TC_FLUSH_UPDATE; $key = FOO_W3TC_FLUSH_UPDATE_KEY; if($update && $key == FOO_W3TC_FLUSH_API_KEY){ if (function_exists('w3tc_pgcache_flush')){ if(w3tc_pgcache_flush()) wp_mail('[email protected]', 'Success!', 'Hello, this is an automatically scheduled email from WordPress.'); else wp_mail('[email protected]', 'Failure', 'Hello, this is an automatically scheduled email from WordPress.'); } echo "Foo W3TC Cache Message"; //For logger die(); //We don't need the rest of WP to load } } 

Finally, I would add the following crontab to run at 11:59pm (your server time) and include a file path to your home directory to log results:

59 23 * * * curl --header 'Cache-Control: max-age=0' http://your-domain.com/wp-content/themes/your-theme/3858f62230ac3c915f300c664312c63f.php >> /home/myuser/w3tc-flush.log 

Hope this helps out!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.