web-dev-qa-db-fra.com

Exécuter la fonction de vidage total du cache W3 avec Crontab

D'accord. Je suis vraiment perplexe sur celui-ci.

Fondamentalement, je dois appeler une fonction pour le plugin Wordpress W3 Total Cache dans le cadre d’un travail cron dans crontab. Je voudrais effacer automatiquement la totalité du cache de la page tous les soirs.

Voici le code qui fonctionne très bien dans WordPress que je dois appeler:

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

J'utilise actuellement le script suivant:

#!/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();
} 

?>

et la ligne de commande:

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

J'ai utilisé la fonction wp_mail pour tester et m'assurer d'obtenir quelque chose.

Le script fonctionne correctement, sauf que le cache de page n'est jamais vidé. Je reçois l'email et il n'y a pas d'erreurs dans le journal non plus.

Des idées?

Merci de votre aide.

1
David

Voici comment j'y arriverais:

Commencez par créer un fichier avec un hachage pour le nom du fichier dans votre répertoire de thème - celui-ci est md5 ('foobar'):

3858f62230ac3c915f300c664312c63f.php

Dans ce fichier, cela ressemblerait à quelque chose comme ça:

//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();

Ajoutez une fonction à votre fichier functions.php similaire à celle-ci:

$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
    }

}

Enfin, j’ajouterais la crontab suivante à exécuter à 23 h 59 (heure de votre serveur) et inclurais un chemin de fichier vers votre répertoire de base pour enregistrer les résultats:

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

J'espère que ça aide!

2
Brian Fegter