Un plugin de WordPress que convierte tu blog en un sitio HTML estático y autocontenido: posts, páginas, imágenes y enlaces internos resueltos a rutas locales relativas.
La copia resultante se puede servir desde cualquier hosting plano (incluso desde una memoria USB), sin PHP, sin base de datos y sin dependencias. Es ideal para archivar un blog antes de migrarlo, mantener un respaldo navegable independiente de WordPress, o publicar un espejo congelado en GitHub Pages, Netlify, Cloudflare Pages o un subdominio del propio cPanel.
Este plugin nació como una herramienta ad-hoc para archivar Blogpocket después de años de publicaciones. Lo que empezó como una tarde de exportación acabó siendo un viaje con varias paradas: imágenes enterradas que reventaban la memoria de PHP, JPEGs antiguos en espacio CMYK que ninguna librería de conversión aceptaba, enlaces hardcodeados a un dominio que el blog tuvo en el pasado... cada bache se convirtió en una mejora del código.
El resultado: un plugin que no se limita a volcar HTML, sino que entiende cómo está construido WordPress, qué peculiaridades arrastran los contenidos antiguos, y cómo dejar una copia que se pueda servir tal cual desde cualquier sitio.
Si quieres la crónica completa del proceso (incluida la parte de optimizar a WebP para que la copia entre en GitHub Pages), hay un artículo en Blogpocket.es.
- Genera un archivo
.htmlpor cada post y cada página, organizados enaño/mes/slug.htmlypages/slug.html. - Descarga las imágenes referenciadas en el contenido a una carpeta
/img/local, renombradas con hash MD5 para evitar colisiones. - Reescribe los enlaces internos entre posts y páginas a rutas locales relativas. Si tu blog cambió de dominio en algún momento, los enlaces hardcodeados al dominio antiguo también se reescriben (declarándolos en una constante).
- Genera índices automáticos: raíz, por año, por mes, y de páginas.
- Aplica un CSS minimalista común a todo el archivo.
- Procesa los posts de forma defensiva: si uno falla, los demás siguen y se reporta cuál falló.
- Descarga las imágenes en streaming directo a disco, sin pasarlas por RAM: las imágenes grandes ya no son un problema.
La copia se deposita en /wp-content/uploads/copia-estatica-html/ de tu propio servidor.
- Descarga este repositorio como ZIP o
git clone. - Sube la carpeta
copia-estaticaal directorio/wp-content/plugins/de tu WordPress. - Activa el plugin desde el panel de administración.
- Encontrarás un nuevo menú Copia Estática en la barra lateral.
En el menú Copia Estática tienes dos secciones:
- Exportar Entradas (Blog): eliges un año y los meses que quieras incluir. Genera un
.htmlpor cada post publicado de ese rango. - Exportar Páginas (Estáticas): exporta de un golpe todas las páginas publicadas (Quiénes somos, Contacto, etc.).
Recomendación: si tu blog tiene años con muchos posts (o con imágenes pesadas), exporta mes a mes en lugar del año completo. El plugin va imprimiendo en wp-content/debug.log por dónde va, lo que ayuda a diagnosticar si algo falla.
Se declaran en wp-config.php, antes de la línea /* That's all, stop editing! */.
Tamaño máximo aceptable por imagen, en bytes. Las que excedan este límite se saltan y quedan registradas en el log. Por defecto, 30 MB.
define( 'CEL_MAX_IMG_SIZE', 50 * 1024 * 1024 ); // 50 MBLista de dominios históricos del blog, separados por comas. Si tu sitio ha vivido en otros dominios antes del actual y dentro del contenido de posts antiguos hay enlaces hardcodeados a esos dominios, declararlos aquí permite al plugin reconocerlos como "internos" y reescribirlos a rutas locales.
define( 'CEL_EXTRA_INTERNAL_HOSTS', 'midominio-viejo.com,otro-historico.es' );Si tu blog ha vivido siempre en el mismo dominio, ignora esta constante. El plugin detecta el dominio actual automáticamente.
Dos scripts opcionales que cubren tareas posteriores a la generación:
tools/convertir-img-a-webp.sh— script bash para macOS/Linux que convierte la carpeta/img/entera a WebP y reescribe las referencias en los HTML. En blogs con muchas imágenes la reducción de tamaño ronda el 60-80%, suficiente para hacer la copia desplegable a GitHub Pages (1 GB de límite duro).tools/reescribir-enlaces-internos.py— script Python para reescribir enlaces internos directamente sobre una copia ya generada, sin tener que regenerarla en WordPress. Útil cuando se han añadido dominios históricos alCEL_EXTRA_INTERNAL_HOSTSdespués de exportar.
Más detalles en tools/README.md.
- WordPress 5.6 o superior.
- PHP 7.4 o superior.
- Probado hasta WordPress 6.9.
El plugin pasa el Plugin Check oficial de WordPress.org sin errores en su versión 1.8. Incluye los archivos requeridos (readme.txt en inglés, cabecera con licencia, sanitización y escape estándar) por si en algún momento decides subirlo al directorio oficial.
GPL v2 o superior. El mismo modelo que WordPress.
Issues y pull requests son bienvenidos. Si encuentras una casuística que no contempla (un permalink especial, una estructura de contenido inusual, un caso de fallo nuevo), abre un issue con el detalle y los logs si los tienes.