Je cherche une solution et je ne sais pas par où commencer.
Tous mes sites HTML Joomla statiques sont mis en cache par Cloudflare. Après avoir mis à jour un article sur joomla, je mets à jour le manuel du cache Cloudflare avec une demande d'API.
Je recherche donc une solution pour envoyer la demande d'API automatiquement après avoir appuyé sur le bouton Enregistrer sur joomla.
L'URL "réelle" est déjà disponible dans un champ personnalisé par l'article.
Voici mon premier plugin:
<?php
/**
* Plugin class for update the Cloudflare Cache after save a article
*/
class plgContentBk_onsave extends JPlugin
{
public function onContentAfterSave ($context, $article, $isNew)
{
// I have saved the URL in a custom field by the article to protect against duplicate content.
// I use this field for <link rel="canonical" href="..."> too.
// so I get the URl from the article:
$context = 'com_content.article';
$article = JModelLegacy::getInstance('Article', 'ContentModel')->getItem();
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); // Helper to get the field by the article
$fields = FieldsHelper::getFields($context, $article);
$fields = json_decode(json_encode($fields), true); // convert to a array
$url = $fields[0]["value"]; // Get the URL from the Field $fields[0]["value"] the custom field in the article
// if you want to see all your custom fields : var_dump($fields)
// Okay now the part that delete the Cloudflare cache:
$authKey = "XXX";
$authEmail = "XXX";
$zoneId = "XXX";
$endpoint = "purge_cache";
$data = '{"files":[
"'.$url.'"
]}';
$url = "https://api.cloudflare.com/client/v4/zones/{$zoneId}/{$endpoint}";
$opts = ['http' => [
'method' => 'DELETE',
'header' => [
"Content-Type: application/json",
"X-Auth-Key: {$authKey}",
"X-Auth-Email: {$authEmail}",
],
'content' => $data,
]];
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);
// to sse the Cloudflare result use: var_dump($result);
// add exit; to see all otputs like var_dumps
return true;
}
}
?>
Testé et fonctionne très bien. Après avoir enregistré l'article, le CDN Cloudflare pour l'url n est purgé.
Toutes les améliorations sont les bienvenues.
Merci à tous ici pour votre soutien pour résoudre mon problème.
J'ai ajouté pour voir le succès après la sauvegarde:
ob_start();
var_dump($result);
$ext = ob_get_clean();
// to see the Cloudflare result use: var_dump($result);
// add exit; to see all otputs like var_dumps
$application = JFactory::getApplication();
$message="Cloudflare Update von: ".$fields[0]["value"]."<br>".$ext; $type="notice";
$application->enqueueMessage(JText::_($message), 'notice');
Pour autant que je me souvienne puisque je n'ai pas testé cela récemment, vous n'avez pas besoin d'effacer le cache de CloudFlare pour afficher les mises à jour des articles avec CloudFlare. CloudFlare ne mettra en cache que les actifs statiques tels que css, js. Dans tous les cas, il existe des plugins prêts à l'emploi qui font le travail. Un que je peux recommander est le CleanLabs Cache Cleaner : https://www.regularlabs.com/extensions/cachecleaner/features
La version Pro du plugin prend en charge la purge automatique de CloudFlare Cache tout en enregistrant le contenu dans le backend Joomla.