15/8/20

Cache simple para posts en Wordpress


Una serie de problemas con los plugins de cache de Wordpress me llevaron a buscar una alternativa. Y encontré una bastante simple.

Dos archivos php extra dentro del theme. Una carpeta para guardar las páginas cacheadas. Y una edición al archivo single.php

Primero, dos archivos nuevos:

top-cache.php

<?php
$url = $_SERVER["SERVER_NAME"].str_replace("/", "-", strtok($_SERVER["REQUEST_URI"], '?'));
$cachefile = './wp-content/cache/cached-'.$url.'.html';
// lee del cache si el archivo es posterior a la última modificación del post
if (file_exists($cachefile) && get_post_modified_time( 'U', false, $post->ID, true ) < strtotime('-4 hours', filemtime($cachefile))) {
readfile($cachefile);
exit;
}
ob_start();

La variable $cachefile define la ruta de la carpeta donde se guardan las páginas cacheadas.

La variable $url construye el nombre del archivo que se guardará en el cache. Incluye el hostname y la ruta de la página sin las query (para prevenir que se guarden en cache páginas con variables UTM u otras).

La ruta para guardar los archivos del cache en este caso es /wp-content/cache/ . Si la carpeta /cache/ no está creada, tienes que crearla con el FTP. Con permisos chmod 0775.

Si la fecha de modificación del post es anterior a la fecha de creación del archivo en cache, lee el cache. En caso contrario, ejecuta el resto del código (el de la página single.php), incluido el segundo archivo nuevo:

bottom-cache.php

<?php
$url = $_SERVER["SERVER_NAME"].str_replace("/", "-", strtok($_SERVER["REQUEST_URI"], '?'));
$cachefile = './wp-content/cache/cached-'.$url.'.html';
$cached = fopen($cachefile, 'w');
fwrite($cached, ob_get_contents());
fclose($cached);
ob_end_flush(); // Send the output to the browser

Este documento repite las variables $url y $cachefile. Y crea el archivo dentro de la carpeta cache.

Cuando la página está en cache, este archivo no se ejecuta.

single.php

En la página single.php hay que hacer dos pequeñas modificaciones. 

Al comienzo del archivo:

<?php
if (!is_user_logged_in()) {
  include('top-cache.php');
}
get_header(); ?>

Y al final del archivo:

<?php
get_footer();
if (!is_user_logged_in()) {
  include('bottom-cache.php');
}

Si el visitante NO está logueado, entonces carga top-cache.php y bottom-cache.php. Esto previene que los editores y administradores de Wordpress vean páginas cacheadas.

Espero que les sirva. 

No hay comentarios:

Publicar un comentario