Encontré este problema con el sitio web de un amigo. Es una instalación de WordPress con varios complementos. Uno de esos complementos se usa para actualizar varias imágenes (reuniéndolas desde ubicaciones remotas y almacenándolas localmente para ahorrar ancho de banda). Pero al ejecutar el complemento, el sitio web aparentemente se negó a mostrar las imágenes actualizadas y continuamente me dio la versión anterior que definitivamente ya no estaba presente en el servidor.
La caché del navegador se descartó rápidamente como la causa. WordPress puede ser un poco complicado, así que verifiqué todos los demás complementos, complementos y si alguna forma de caché de objetos estaba activa. Después de descartar eso también, se me ocurrió que el proveedor de alojamiento debe ser el problema. No lo sabía y tuve que averiguar que usan Cloudflare como proveedor de DNS para tener un certificado SSL válido para su sitio web. Sin embargo, por defecto, Cloudflare también viene con almacenamiento en caché que puede ser bastante agresivo.
Como les gustaba el almacenamiento en caché y querían mantenerlo activado, le dije a mi amigo que purgara manualmente el caché en Cloudflare. Ta-Da: las imágenes actualizadas se mostraban como deberían.
Entonces, para evitar el proceso de iniciar sesión en Cloudflare cada vez que se llama al complemento, estaba buscando una manera de usar su API para resolver esto de una manera conveniente. Necesitaba algo de código php (para integrarlo en el plugin de WordPress)…
fabians
Escribí un script php pequeño y seguramente mejorable que sirve exactamente para este propósito. Utiliza las credenciales proporcionadas (correo electrónico de usuario y clave API) para conectarse a la API de Cloudflare. Para recuperar la clave API:
-
Acceso a la cuenta de Cloudflare.
-
Ir Mi perfil.
-
Desplácese hacia abajo hasta Claves API y localizar Clave de API global.
-
Haga clic en la clave API para ver su identificador API.
En el primer paso, el script consulta el identificador de zona, que es un identificador único para el dominio que desea controlar. Dado que Cloudflare hasta la fecha no ofrece la opción de ver esta ID en su backend, solo se puede obtener a través de una solicitud de API.
En el segundo paso, nos conectamos nuevamente a la API de Cloudflare, esta vez indicándonos que purguemos todo el caché de esa zona.
Aquí está mi solución (puse esto en la parte inferior de mi secuencia de comandos de actualización de complementos, para que se ejecute después de que todo lo demás haya terminado):
<?php
//Credentials for Cloudflare
$cust_email=""; //user@domain.tld
$cust_xauth=""; //retrieved from the backend after loggin in
$cust_domain = ''; //domain.tld, the domain you want to control
if($cust_email == "" || $cust_xauth == "" || $cust_domain == "") return;
//Get the Zone-ID from Cloudflare since they don't provide that in the Backend
$ch_query = curl_init();
curl_setopt($ch_query, CURLOPT_URL, "https://api.cloudflare.com/client/v4/zones?name=".$cust_domain."&status=active&page=1&per_page=5&order=status&direction=desc&match=all");
curl_setopt($ch_query, CURLOPT_RETURNTRANSFER, 1);
$qheaders = array(
'X-Auth-Email: '.$cust_email.'',
'X-Auth-Key: '.$cust_xauth.'',
'Content-Type: application/json'
);
curl_setopt($ch_query, CURLOPT_HTTPHEADER, $qheaders);
$qresult = json_decode(curl_exec($ch_query),true);
curl_close($ch_query);
$cust_zone = $qresult['result'][0]['id'];
//Purge the entire cache via API
$ch_purge = curl_init();
curl_setopt($ch_purge, CURLOPT_URL, "https://api.cloudflare.com/client/v4/zones/".$cust_zone."/purge_cache");
curl_setopt($ch_purge, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch_purge, CURLOPT_RETURNTRANSFER, 1);
$headers = [
'X-Auth-Email: '.$cust_email,
'X-Auth-Key: '.$cust_xauth,
'Content-Type: application/json'
];
$data = json_encode(array("purge_everything" => true));
curl_setopt($ch_purge, CURLOPT_POST, true);
curl_setopt($ch_purge, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch_purge, CURLOPT_HTTPHEADER, $headers);
$result = json_decode(curl_exec($ch_purge),true);
curl_close($ch_purge);
//Tell the user if it worked
if($result['success']==1) echo "Cloudflare Cache successfully purged! Changes should be visible right away.<br>If not try clearing your Browser Cache by pressing \"Ctrl+F5\"";
else echo "Error purging Cloudflare Cache. Please log into Cloudflare and purge manually!";
?>