WordPress Advanced-Cache.php: El Gancho Oculto para Dominar la Ejecución Temprana

Un manual práctico para desarrolladores que quieren control total antes de que WordPress respire


¿Qué es esto?

En el corazón de WordPress, enterrado en wp-settings.php, hay una puerta trasera oficial:

if ( WP_CACHE && file_exists( WP_CONTENT_DIR . '/advanced-cache.php' ) ) {
    require WP_CONTENT_DIR . '/advanced-cache.php';
}

Esta línea se ejecuta antes de:

Es tu ventana de menos de 1 ms para:


Requisitos (solo 2)

  1. Archivo:
    wp-content/advanced-cache.php
    Debe existir y ser legible por PHP.

  2. Constante en wp-config.php:

    define('WP_CACHE', true);
    

    Sin esto, WordPress ignora el archivo.

Nada más. No necesitas plugins, hooks, ni permisos especiales.


Cómo funciona (flujo real)

  1. El usuario solicita una página.
  2. WordPress carga wp-config.php y define ABSPATH, WP_CONTENT_DIR, etc.
  3. Si WP_CACHE es true y wp-content/advanced-cache.php existe, WordPress lo incluye inmediatamente.
  4. Dentro de ese archivo:

Este es el único punto en todo WordPress donde puedes intervenir antes de que se inicie cualquier lógica del núcleo.


Casos de uso reales (con código)

1. Caché de página estática (ultra rápido)

<?php
$cache_file = WP_CONTENT_DIR . '/cache/' . md5($_SERVER['REQUEST_URI']) . '.html';
if (file_exists($cache_file)) {
    readfile($cache_file);
    exit;
}
// Si no hay caché, no hacer nada → WordPress generará la página

2. Firewall básico por IP

<?php
$blocked_ips = ['203.0.113.10', '198.51.100.55'];
if (in_array($_SERVER['REMOTE_ADDR'], $blocked_ips)) {
    http_response_code(403);
    exit('Access denied.');
}

3. Proteger /wp-admin en entornos de staging

<?php
if (strpos($_SERVER['HTTP_HOST'], 'staging.') === 0 && 
    strpos($_SERVER['REQUEST_URI'], '/wp-admin') === 0) {
    
    if ($_SERVER['REMOTE_ADDR'] !== '192.168.1.100') {
        http_response_code(403);
        exit('Admin access restricted.');
    }
}

4. Bloquear bots maliciosos por User-Agent

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$bad_patterns = ['sqlmap', 'nikto', 'masscan'];
foreach ($bad_patterns as $pattern) {
    if (stripos($user_agent, $pattern) !== false) {
        http_response_code(403);
        exit();
    }
}

5. Combinar ACL + caché