jueves, 22 de octubre de 2026

Vulnerabilidad crítica en PHP (octubre 2026): cómo comprobar y actualizar tu web paso a paso

Esta semana se han publicado parches de emergencia para PHP, el lenguaje en el que funcionan millones de webs. Si tienes una web, una tienda online o simplemente programas en tu Mac, esta guía te lleva de la mano: qué versión tienes, cómo actualizarla y cómo comprobar que tu código sigue funcionando. Los ejemplos usan IONOS como hosting y un Mac, pero sirve igual para otros proveedores. No hace falta ser programador: cada comando lleva su simulación y su explicación.

🧭 Lo que vas a hacer
  1. Entender qué ha pasado (2 minutos).
  2. Mirar qué versión de PHP tiene tu hosting.
  3. Actualizar PHP en tu Mac.
  4. Comprobar que tus archivos PHP no tienen errores.
  5. Pasar una herramienta que detecta código incompatible con versiones nuevas.
  6. Subir de versión en el hosting con seguridad.

🚨 1. Qué ha pasado

El 21 de octubre de 2026 el equipo de PHP publicó las versiones 8.2.35, 8.3.36, 8.4.27 y 8.5.12. Corrigen dos vulnerabilidades críticas, identificadas como CVE-2026-109618 y CVE-2026-109619, que según el propio proyecto pueden permitir ejecución remota de código sin autenticación.

Dicho en llano: alguien desde internet podría conseguir que un servidor con una versión vulnerable ejecute órdenes suyas, sin necesitar ninguna contraseña. El proyecto PHP indica además que no hay mitigaciones completas: actualizar es la única opción segura.

⚖️ Sin alarmismo

Que exista el fallo no significa que tu web haya sido atacada. Significa que hay un parche y que conviene tenerlo puesto cuanto antes. Esta guía es para comprobarlo con calma.

¿Qué parte me toca a mí y cuál al hosting?

Son dos sitios distintos donde se ejecuta PHP:

  • El servidor de tu hosting (IONOS, por ejemplo). En un hosting compartido el servidor lo mantiene el proveedor: él aplica el parche y tú eliges la rama (8.3, 8.4...). En mi caso, IONOS escribió a sus clientes diciendo que ya lo había aplicado, también en versiones sin soporte oficial gracias a su servicio de Soporte Extendido para PHP. Aun así, conviene comprobarlo tú.
  • Tu ordenador. Si programas en local, tu copia de PHP no se actualiza sola.
🎣 Ojo con el phishing

Con noticias así circulan correos falsos que imitan a tu proveedor. No pulses enlaces de un correo: entra a tu panel escribiendo tú la dirección en el navegador, y comprueba que el remitente es del dominio oficial.

🔎 2. Mira qué versión de PHP tiene tu hosting

En el panel de IONOS entra en la sección de Hosting y busca la configuración de PHP (también puedes escribir «PHP» en el buscador del panel). Verás una lista como esta, con cada dominio y la versión que usa:

Configuración de PHP · ejemplo ilustrativo
DominioVersión PHPEstado
tudominio.comPHP 8.4Con soporte
otra-web.esPHP 8.3Con soporte
web-antigua.comPHP 7.4Sin soporte oficial

Recreación de ejemplo con dominios inventados. El diseño real del panel puede cambiar.

Cómo interpretarlo:

  • 8.2, 8.3, 8.4 o 8.5: ramas con parche oficial. Si el hosting ya lo ha aplicado, estás cubierto.
  • 8.1 o anterior: el proyecto PHP ya no las parchea. Algunos proveedores ofrecen soporte extendido, pero lo sensato es subir de rama en cuanto puedas.
📌 Y la versión exacta (el último número)

El panel suele mostrar solo la rama (8.3, 8.4). Si quieres ver la versión exacta, puedes crear un archivo de prueba, abrirlo en el navegador y borrarlo enseguida. Es importante borrarlo: enseña información interna de tu servidor.

info.php
<?php phpinfo(); ?>
👉 Cómo se usa: guarda esa línea en un archivo llamado info.php, súbelo a tu web, ábrelo (tudominio.com/info.php) y mira el título de la página, donde pone «PHP Version». Después elimínalo del servidor.

💻 3. Actualiza PHP en tu Mac

Aunque tu web esté en un hosting, es muy probable que tengas PHP también en tu propio ordenador para programar y probar. Esa copia no se actualiza sola: la tienes que actualizar tú. Son cuatro pasos y se hacen en la aplicación Terminal (la encuentras con Spotlight: ⌘ + Espacio y escribes «Terminal»).

📌 Qué versiones ya están corregidas

Cada rama de PHP tiene su propio parche. La tuya tiene que ser igual o superior a la de esta tabla:

Si usas la rama…Debes tener al menos…
PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35
PHP 8.1 o anteriorSin parche oficial: conviene subir de rama

Paso 1 · Mira qué versión tienes ahora

Escribe el comando y pulsa Enter. Pulsa ▶ Ver ejemplo para ver cómo se vería en tu pantalla.

Terminal — zsh
tu-usuario@mac ~ % php -v
PHP 8.5.5 (cli) (built: Apr 7 2026 16:24:10) (NTS)
Copyright (c) The PHP Group
Built by Homebrew
Zend Engine v4.5.5, Copyright (c) Zend Technologies
Simulación: tu salida puede variar un poco
👉 Cómo se lee: fíjate solo en el primer número, aquí 8.5.5. La versión corregida de la rama 8.5 es la 8.5.12, así que esta copia está desactualizada.
💡 Consejo

Si en lugar de la versión te sale command not found: php, es que no tienes PHP instalado en el Mac. Entonces no hay nada que actualizar; puedes instalarlo más adelante con brew install php si quieres probar tus proyectos en local.

Paso 2 · Actualiza la lista de Homebrew

Homebrew es el programa que instala y actualiza PHP en el Mac. Primero le pedimos que consulte cuáles son las últimas versiones disponibles.

Terminal — zsh
tu-usuario@mac ~ % brew update
==> Updating Homebrew...
Updated 2 taps (homebrew/core and homebrew/cask).
Simulación: tu salida puede variar un poco
👉 Cómo se lee: «Updated» significa que Homebrew ya conoce las últimas versiones. No ha cambiado nada en tu Mac todavía.

Paso 3 · Instala la versión con el parche

Ahora sí: le pedimos que actualice PHP. Homebrew te enseñará qué va a cambiar y te preguntará si quieres continuar. Escribe y (de «yes») y pulsa Enter. Puede tardar unos minutos, porque también actualiza librerías que PHP necesita.

Terminal — zsh
tu-usuario@mac ~ % brew upgrade php
==> Would upgrade 1 requested outdated package
php 8.5.5 -> 8.5.12 (29.4MB)
==> Would upgrade 1 dependent
composer 2.9.7 -> 2.10.3 (831.4KB)
==> Do you want to proceed with the upgrade? [y/n]
y
==> Upgrading php
php 8.5.12 instalado ✔
Simulación: tu salida puede variar un poco
👉 Cómo se lee: la línea amarilla te dice de qué versión a cuál pasa (8.5.5 → 8.5.12). Si Homebrew no te ofrece la nueva todavía, repite el paso 2 pasadas unas horas.

Paso 4 · Comprueba que ha funcionado

Cierra la ventana de Terminal, ábrela de nuevo y repite el comando del paso 1.

Terminal — zsh
tu-usuario@mac ~ % php -v
PHP 8.5.12 (cli) (built: Oct 19 2026 17:02:46) (NTS)
Copyright (c) The PHP Group
Built by Homebrew
Zend Engine v4.5.12, Copyright (c) Zend Technologies
Simulación: tu salida puede variar un poco
✅ Cómo se lee: ahora sale 8.5.12, la versión con el parche. Tu Mac está al día.
⚠️ Importante

Si usas un servidor local (por ejemplo php -S, MAMP o Apache) y lo tenías encendido mientras actualizabas, reinícialo para que use la versión nueva.

✅ 4. Comprueba que tus archivos PHP no tienen errores

Antes de subir de versión en el hosting, conviene saber si tu código se lleva bien con PHP moderno. La primera comprobación es la más sencilla: php -l (la «l» es de lint, revisar). Lee el archivo y te dice si PHP lo entiende. No ejecuta nada.

Un solo archivo

Terminal — zsh
tu-usuario@mac mi-web % php -l checkout.php
No syntax errors detected in checkout.php
Simulación: tu salida puede variar un poco
✅ Cómo se lee: «No syntax errors» = PHP entiende el archivo sin problemas.

Y así se ve cuando hay un fallo (aquí, una llave que sobra):

Terminal — zsh
tu-usuario@mac mi-web % php -l checkout.php
PHP Parse error: Unmatched '}' in checkout.php on line 12
Errors parsing checkout.php
Simulación: tu salida puede variar un poco
❌ Cómo se lee: te dice el archivo y la línea donde mirar. Ese mensaje es el que puedes copiar y pegar a quien te ayude a arreglarlo.

Todos los archivos de una carpeta

Sustituye ~/mi-web por la carpeta de tu proyecto. Un truco: escribe find y arrastra la carpeta desde el Finder a la ventana de Terminal; la ruta se escribe sola.

Terminal — zsh
tu-usuario@mac ~ % find ~/mi-web -name "*.php" -exec php -l {} \;
No syntax errors detected in /Users/tu-usuario/mi-web/index.php
No syntax errors detected in /Users/tu-usuario/mi-web/checkout.php
No syntax errors detected in /Users/tu-usuario/mi-web/data/pagos.php
Simulación: tu salida puede variar un poco
👉 Cómo se lee: una línea por archivo. Si tienes muchos y solo quieres ver los problemas, añade al final | grep -v "No syntax errors": si no sale nada, todo está bien.
📌 Qué comprueba y qué no

php -l solo confirma que el código está bien escrito para la versión de PHP que tengas en tu Mac. No avisa de funciones obsoletas ni de errores de lógica. Para eso sirve la herramienta del siguiente apartado.

🧰 5. Instala una herramienta que detecta código incompatible

PHPCompatibility revisa tu código y te dice qué funciones se han eliminado (dan error) o están obsoletas (funcionan hoy, pero dejarán de hacerlo) en la versión de PHP a la que quieres subir. Se instala una sola vez y vale para todos tus proyectos. Necesita Composer, que es el gestor de paquetes de PHP.

Paso 1 · Instala Composer

Terminal — zsh
tu-usuario@mac ~ % brew install composer
==> Installing composer
composer instalado ✔
Simulación: tu salida puede variar un poco
👉 Cómo se lee: si ya lo tenías, Homebrew te avisará de que ya está instalado. No pasa nada.

Paso 2 · Crea una carpeta para las herramientas

Terminal — zsh
tu-usuario@mac ~ % mkdir -p ~/php-tools && cd ~/php-tools
(no muestra nada: es normal, ha ido bien)
Simulación: tu salida puede variar un poco
👉 Cómo se lee: en Terminal, que no salga nada suele significar que todo ha ido bien. Solo cambia el prompt: ahora estás dentro de la carpeta php-tools.

Paso 3 · Instala la herramienta

Es un único comando largo, pulsa Copiar para no equivocarte. Durante la instalación Composer te preguntará si confías en un plugin necesario (phpcodesniffer-composer-installer). Responde y.

Terminal — zsh
tu-usuario@mac php-tools % composer require --dev squizlabs/php_codesniffer phpcompatibility/php-compatibility dealerdirect/phpcodesniffer-composer-installer
./composer.json has been created
Installing dependencies from lock file (including require-dev)
- Installing squizlabs/php_codesniffer
Do you trust "dealerdirect/phpcodesniffer-composer-installer" to execute code? [y,n,d,?]
y
- Installing phpcompatibility/php-compatibility
Instalación completada ✔
Simulación: tu salida puede variar un poco
👉 Cómo se lee: la línea amarilla es la pregunta de confianza. Es el plugin que conecta las dos herramientas; es el que hay que permitir.

Paso 4 · Comprueba que quedó instalada

Terminal — zsh
tu-usuario@mac php-tools % ~/php-tools/vendor/bin/phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR2, PSR12, Squiz, Zend and PHPCompatibility
Simulación: tu salida puede variar un poco
✅ Cómo se lee: si al final de la lista aparece PHPCompatibility, ya lo tienes listo.

📋 6. Revisa tu proyecto y aprende a leer el resultado

Ahora lo pasamos por tu proyecto. Cambia 8.4- por la versión a la que quieres subir (el guion final significa «esta versión o superiores»). Como antes, puedes arrastrar la carpeta desde el Finder para escribir la ruta al final del comando.

Terminal — zsh
tu-usuario@mac ~ % ~/php-tools/vendor/bin/phpcs -p --standard=PHPCompatibility --runtime-set testVersion 8.4- --extensions=php --ignore=vendor /ruta/de/tu/proyecto
............................................................ 60 / 73 (82%)
............. 73 / 73 (100%)
Time: 940ms; Memory: 18MB
Simulación: tu salida puede variar un poco
✅ Cómo se lee: cada punto es un archivo revisado y sin problemas. Si al final solo aparece «Time», no ha encontrado nada: puedes subir de versión con tranquilidad.

¿Y si salen errores?

Verás un bloque por cada archivo con problemas. Se interpretan así:

  • ERROR: ese código se romperá (o ya se rompe) en la versión que has indicado. Hay que arreglarlo antes de subir.
  • WARNING: funciona hoy, pero está obsoleto y dejará de funcionar más adelante. Conviene arreglarlo con calma.
Terminal — zsh
tu-usuario@mac ~ % ~/php-tools/vendor/bin/phpcs -p --standard=PHPCompatibility ... /ruta/de/tu/proyecto
FILE: /Users/tu-usuario/mi-web/checkout.php
------------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
------------------------------------------------------------------------
25 | ERROR | Using 'break' outside of a loop or switch structure is invalid
| | and will throw a fatal error since PHP 7.0
Simulación: tu salida puede variar un poco
👉 Cómo se lee: te da el archivo, la línea (25), el tipo (ERROR) y la explicación. Con eso sabes exactamente dónde mirar.
🧪 Ojo: a veces es un falso positivo

Esta herramienta lee el código sin ejecutarlo y a veces se equivoca. El caso más típico es el mensaje de arriba («'break' outside of a loop») cuando el break está dentro de un bucle escrito en una sola línea y sin llaves, como este:

foreach ($lista as $x) if ($x == 1) { echo "ok"; break; }

Ese código es válido, pero la herramienta no lo entiende bien. Cómo salir de dudas: pasa php -l sobre ese archivo (apartado 4). Si PHP dice «No syntax errors detected», el archivo es correcto y el aviso era una falsa alarma. Si de verdad hubiera un break fuera de un bucle, PHP daría error fatal al cargar la página.

🚀 7. Sube de versión en el hosting con seguridad

Si la revisión sale limpia (o solo con falsos positivos), ya puedes cambiar la versión. Hazlo de una web en una web, empezando por la menos importante.

  1. Vuelve a la pantalla de configuración de PHP de tu hosting (apartado 2).
  2. Marca solo el dominio que quieras cambiar y elige la nueva versión (por ejemplo, de 8.3 a 8.4).
  3. Guarda. El cambio puede tardar unos minutos en aplicarse.
  4. Prueba la web. Mira la lista de abajo.
  5. Si algo falla, vuelve a la versión anterior desde el mismo panel y revisa el registro de errores.
🧪 Qué probar después de cambiar
  • La portada y varias páginas interiores.
  • Todos los formularios (contacto, registro, buscador...).
  • Si tienes tienda: carrito, checkout y pagos, con un pedido de prueba o en modo sandbox, nunca con uno real.
  • El panel de administración, subiendo una imagen.
  • Cualquier envío de emails o conexión con otros servicios.
📌 ¿Y si no sale nada raro pero la página sale en blanco?

Un error 500 o una página en blanco suele significar que PHP ha encontrado algo que no soporta. No vuelvas atrás a ciegas: mira primero el registro de errores del hosting, porque ahí aparece el archivo y la línea exactas. Si no lo localizas, vuelve a la versión anterior y pasa ese mensaje a quien te ayude con la programación.

🧾 8. Checklist final

Marca lo que ya has hecho (es solo para ti, no se guarda).

Fuentes: aviso de seguridad del proyecto PHP del 21 de octubre de 2026, en la web oficial de PHP, y notas de la versión 8.5.12 en GitHub. Los números de versión y los identificadores CVE son los publicados por el propio proyecto. Los dominios, rutas y salidas de terminal de esta guía son ejemplos ilustrativos.

lunes, 21 de septiembre de 2026

Mail muestra el texto en blanco y símbolos ? tras actualizar macOS: la culpa es de tus fuentes

Actualizas macOS, abres Mail y los correos llegan sin texto: solo se ven los subrayados azules de los enlaces y unos cuadritos con una interrogación. Parece un problema de codificación, pero no lo es. Te cuento qué pasa de verdad, cómo se arregla en dos minutos y cómo revisar tu biblioteca de fuentes para que no vuelva a ocurrir.

Apple Mail mostrando un correo sin texto: solo se ven los subrayados de los enlaces y cuadros con interrogación
Así llegan los correos: enlaces subrayados sin texto y cuadros con ? donde debería haber iconos. Pulsa para ampliar.

🧩 El síntoma

Después de actualizar a una versión mayor de macOS, algunos correos (sobre todo los que vienen de Outlook, con fuentes como Calibri o Arial) se muestran así:

❌ El cuerpo del mensaje está vacío, pero los enlaces conservan su subrayado azul.
❌ Aparecen cuadrados con un ? donde debería haber iconos o viñetas.
❌ Las imágenes y los banners se ven perfectamente.
✅ El mismo correo se lee bien en el iPhone o en la web.

Ese último punto es la pista definitiva: el correo está bien. Es tu Mac el que no sabe dibujar las letras.

🔎 Por qué pasa

Mail usa WebKit (el motor de Safari) para pintar los correos HTML. Cuando WebKit necesita una fuente y el sistema le devuelve un registro corrupto o vacío, no la sustituye por otra: simplemente no dibuja nada, y los caracteres especiales salen como un ? en un recuadro. Por eso los subrayados sí se ven (los pinta CSS) y las letras no (las pintaría la fuente).

¿Y por qué justo tras actualizar? Porque una actualización mayor reconstruye la base de datos de fuentes del sistema. Si usas un gestor de fuentes (RightFont, FontExplorer, Suitcase, FontBase…) y en tu biblioteca hay fuentes obsoletas o ficheros vacíos, el gestor las vuelve a registrar al arrancar y deja la caché en un estado que rompe el renderizado.

💡 En mi caso el culpable era RightFont con una biblioteca guardada en iCloud Drive que venía de una importación antigua de FontExplorer X. Pero el procedimiento vale para cualquier gestor de fuentes.

⚡ Solución rápida: limpiar la caché de fuentes

Antes de nada, cierra tu gestor de fuentes del todo (con ⌘Q, no solo la ventana). Después abre Terminal y pega esto:

📋 Copiar
TERMINAL MAC
sudo atsutil databases -remove

Te pedirá tu contraseña. Verás una línea Removing: …/com.apple.FontRegistry y es posible que aparezca algún error diciendo que no puede borrar un fichero que "no existe": es normal, significa que esa caché ya estaba vacía.

⚠️ Si ves el mensaje "ATS is not supported starting macOS 14", ignóralo. Desde macOS Sonoma los subcomandos atsutil server están obsoletos, pero databases -remove sigue funcionando y es el único que necesitas.

Ahora reinicia el Mac. Al arrancar, macOS regenera la caché limpia. Abre Mail sin abrir aún el gestor de fuentes y comprueba que el texto ha vuelto. Si es así, ya sabes de dónde viene el problema y toca revisar la biblioteca.

💡 ¿No puedes reiniciar ahora? Reinicia solo el servicio de fuentes y Mail con sudo killall -9 fontd seguido de killall Mail. Funciona en la mayoría de casos, pero el reinicio completo es más fiable.

🕵️ Diagnóstico de tu biblioteca de fuentes

Vamos a buscar en tu biblioteca cuatro tipos de problemas. Todos los comandos son de solo lectura: no borran ni mueven nada, solo listan.

Escribe abajo la ruta de la carpeta donde tu gestor guarda las fuentes y los comandos de esta página se rellenarán solos con ella. Si usas RightFont con la biblioteca en iCloud Drive, pulsa el botón y listo.

Usar la ruta de RightFont (iCloud)
Limpiar
Puedes usar ~ para tu carpeta de usuario. Las comillas ya van incluidas en los comandos, no las pongas tú. Para averiguar la ruta de RightFont: RightFont → Ajustes → Biblioteca.

1. Fuentes en formatos obsoletos (PostScript Type 1 y maletas de Mac OS 9)

macOS dejó de soportar las fuentes PostScript Type 1 hace años, y las maletas .suit son aún más antiguas. Un gestor que intente activarlas puede romper la caché.

📋 Copiar
TERMINAL MAC

Si no devuelve nada, perfecto. Si aparece alguna, apúntala: la retiraremos más abajo.

2. Ficheros que dicen ser fuentes pero no lo son

Un OTF o TTF truncado, o una descarga fallida guardada con extensión de fuente, también es veneno para la caché. Este comando revisa cada fichero con la utilidad file y solo imprime los que no son fuentes válidas.

📋 Copiar
TERMINAL MAC
⏳ Este comando tarda: lanza un análisis por cada fuente, y si tienes miles puede irse a varios minutos. Que Terminal parezca "colgado" sin escribir nada es buena señal: solo imprime cuando encuentra una no válida. Déjalo terminar.

3. Ficheros vacíos o sin descargar de iCloud

Este es el gran clásico si tu biblioteca vive en iCloud Drive. Las fuentes antiguas de Mac guardaban todo en el resource fork, que iCloud no conserva: llegan al otro lado como ficheros de 0 bytes. Y con "Optimizar almacenamiento" activado, cualquier fuente puede quedarse en la nube como un marcador .icloud que el gestor intenta activar sin éxito.

📋 Copiar
TERMINAL MAC

Si ves parejas de nombres tipo TelegramPlain y TelegPla (uno largo y otro abreviado), son fuentes PostScript Type 1 de Mac OS 9 que se quedaron vacías al pasar por iCloud. No hay nada que recuperar ahí.

4. Copias de fuentes del sistema

Helvetica, Arial, Times, Calibri… ya vienen con macOS u Office. Si tu gestor activa una segunda copia, macOS tiene dos registros para el mismo nombre y puede acabar usando el peor.

📋 Copiar
TERMINAL MAC

🧹 Qué hacer con lo que encuentres

Nada de borrar: lo movemos a una carpeta Fuentes-retiradas en tu carpeta de usuario, conservando la estructura original por si quieres revisarlo después. Cuando estés seguro de que todo va bien, la borras entera.

Retirar formatos obsoletos (resultado del paso 1)

📋 Copiar
TERMINAL MAC

Retirar ficheros vacíos (resultado del paso 3)

📋 Copiar
TERMINAL MAC
⚠️ Si el paso 3 te devolvió ficheros .icloud (no vacíos, sino sin descargar), no los muevas. Haz clic derecho sobre la carpeta de la biblioteca en Finder → Descargar ahora, espera a que baje todo y repite el paso 3.

Retirar copias de fuentes del sistema (resultado del paso 4)

Aquí no hay comando genérico: revisa la lista a mano, porque una fuente llamada "Helvetica Neue LT Pro" puede ser una compra legítima que sí quieres conservar. Lo que no quieres son copias exactas de las que ya trae macOS. Desactívalas desde el propio gestor y, si se repiten en Catálogo Tipográfico con el triángulo amarillo, usa Edición → Resolver duplicados conservando siempre la copia del sistema.

Limpiar carpetas vacías y comprobar

📋 Copiar
TERMINAL MAC

La segunda línea debe devolver 0. Después, en tu gestor de fuentes, fuerza un reescaneo de la biblioteca (en RightFont: Ajustes → Biblioteca) para que olvide las entradas retiradas.

🛡️ Para que no vuelva a pasar

  • Biblioteca en iCloud Drive: clic derecho sobre la carpeta → Mantener descargado. O desactiva "Optimizar almacenamiento del Mac" en Ajustes del Sistema → iCloud → iCloud Drive.
  • Nunca actives desde el gestor fuentes que ya trae macOS (Helvetica, Arial, Times, Verdana, Georgia, Courier, Menlo, SF Pro) ni las de Office (Calibri, Cambria).
  • Antes de una actualización mayor de macOS, cierra el gestor de fuentes y quítalo de los ítems de inicio. Actualiza, comprueba que Mail y Safari van bien, y solo entonces vuelve a abrirlo.
  • Si importas una biblioteca antigua (FontExplorer, Suitcase…), pasa estos cuatro comandos antes de activar nada.
  • Las fuentes de Catálogo Tipográfico → Archivo → Validar fuentes con aviso rojo o amarillo, fuera.

✅ Resumen rápido

💡 Lo mínimo que necesitas recordar
Texto en blanco y ? en Mail tras actualizar = caché de fuentes rota, no codificación.
Cierra el gestor de fuentes, sudo atsutil databases -remove, reinicia.
Revisa la biblioteca: formatos obsoletos, ficheros no válidos, vacíos de iCloud y duplicados del sistema. Retíralos y reescanea.

En mi biblioteca aparecieron una maleta .suit de Mac OS 9 y unos 140 ficheros de 0 bytes de fuentes Type 1 que iCloud había dejado huecas. Fuera todo, caché limpia, reinicio… y Mail volvió a mostrar los correos como si nada. Si te bloqueas en algún paso, déjame un comentario y te echo una mano. 👋

viernes, 11 de septiembre de 2026

LightBurn: The system time is incorrect or has been tampered with …

LightBurn dice que la hora del sistema está mal: cómo arreglarlo desde CMD

Abres LightBurn y, antes de poder hacer nada, te suelta una ventana de error sobre la hora del sistema. Miras el reloj de Windows, está bien… y aun así no arranca. Te cuento qué pasa y cómo se arregla en dos minutos el error.

LightBurn, tal como arranca, muestra una ventana con este error:

⚠️ The system time is incorrect or has been tampered with. Ensure your date and time settings are correct, and synchronized with network time.

Que Windows muestre la hora correcta no significa necesariamente que LightBurn la considere válida. LightBurn utiliza Cryptlex para la licencia, y ese sistema puede detectar que el reloj fue modificado anteriormente aunque ahora vuelva a mostrar la hora correcta.

💡 Para repararlo forzaremos la sincronización desde CMD, sin entrar en Configuración de Windows. Abre el Símbolo del sistema como administrador (botón derecho sobre CMD → «Ejecutar como administrador»): los comandos del servicio de hora lo necesitan.

🔧 Los cinco pasos

Empezamos. Pulsa 📋 Copiar en cada bloque, pégalo en CMD y dale a Intro.

1. Detener el servicio de Hora de Windows

📋 Copiar
CMD WINDOWS (ADMINISTRADOR)
net stop w32time

Detiene Windows Time para reiniciar su estado antes de volver a configurarlo.

2. Volver a iniciar el servicio

📋 Copiar
CMD WINDOWS (ADMINISTRADOR)
net start w32time

Arranca de nuevo el servicio. Esto es importante porque w32tm /config … /update necesita que esté funcionando.

3. Configurar time.windows.com como fuente de hora

📋 Copiar
CMD WINDOWS (ADMINISTRADOR)
w32tm /config /manualpeerlist:"time.windows.com,0x8" /syncfromflags:manual /update

Indica a Windows que utilice el servidor NTP de Microsoft y aplica la configuración.

4. Forzar la sincronización

📋 Copiar
CMD WINDOWS (ADMINISTRADOR)
w32tm /resync /force

Hace que Windows sincronice inmediatamente su reloj con el servidor configurado.

5. Comprobar el resultado

📋 Copiar
CMD WINDOWS (ADMINISTRADOR)
w32tm /query /status

Permite verificar la fuente de hora y la última sincronización correcta. En mi caso terminó mostrando:

✅ Origen: time.windows.com,0x8
Última sincronización correcta: 11/09/2026 11:43:18
Indicador de salto: 0 (ninguna advertencia)

Con eso, vuelve a abrir LightBurn. La ventana de error ya no aparece y la licencia se valida con normalidad.

Sin tocar Configuración de Windows, sin reinstalar LightBurn, sin historias.

martes, 7 de julio de 2026

Cómo instalar el plugin de WordPress para conectar Claude (Mac y Windows).

Imagina pedirle a Claude “créame un borrador sobre X” y que aparezca solo en tu WordPress. Se puede, y se monta en un rato 😊

La pieza que lo hace posible se llama MCP (Model Context Protocol). Es como un enchufe estándar que conecta Claude con tu web para que pueda leer, crear y editar contenido hablándole en lenguaje normal. Para eso hay que instalar un pequeño plugin en WordPress y conectar Claude Desktop a él.

💡 Necesitas un WordPress self-hosted (donde puedas subir plugins) y la app Claude Desktop. Abajo tienes la guía entera para Mac y, a continuación, la de Windows. Ve directo a la tuya.

🧩 Lo que necesitas

  • Un WordPress donde seas administrador
  • Claude Desktop instalado
  • Node.js (lo instalamos en el paso 1)

🍎 Guía completa para Mac

1. Instala Node.js

Es el “motor” que usa Claude para hablar con tu WordPress. En Mac, con Homebrew instalado, abre Terminal y pega:

📋 Copiar
TERMINAL MAC
brew install node

Comprueba que quedó bien:

📋 Copiar
TERMINAL MAC
node --version

Si te devuelve un número de versión, listo 👍

2. Descarga el plugin

Usaremos WordPress MCP de Automattic. Ojo: no descargues el código con el botón verde “Code”. Ve a la sección Releases del proyecto en GitHub y baja el archivo wordpress-mcp.zip (viene ya listo para instalar).

💡 No descomprimas el .zip. WordPress lo necesita tal cual.

3. Instálalo y actívalo en WordPress

En tu panel: Plugins → Añadir nuevo → Subir plugin, elige el wordpress-mcp.zip, Instalar ahora y luego Activar. Después ve a Ajustes → MCP y activa Enable MCP functionality (sin esto no hay conexión). Para crear y editar contenido, activa también Enable Create Tools y Enable Update Tools. Deja apagado Delete Tools por seguridad.

4. Crea una contraseña de aplicación

Es una clave especial y revocable, distinta de tu contraseña de acceso. Ve a Usuarios → Perfil, baja hasta Contraseñas de aplicación, ponle un nombre (“Claude Desktop”) y pulsa Añadir nueva. Cópiala: se muestra una sola vez.

⚠️ No uses tu contraseña de acceso normal, y no la pegues en ningún chat: solo va en el archivo de configuración de tu Mac.

5. Configura Claude Desktop

Abre este archivo con un editor de texto:

📋 Copiar
RUTA (MAC)
~/Library/Application Support/Claude/claude_desktop_config.json

Y pega esta configuración (cambia el dominio, el usuario y la contraseña de aplicación por los tuyos):

📋 Copiar
claude_desktop_config.json (MAC)
{
  "mcpServers": {
    "wordpress-mcp": {
      "command": "/opt/homebrew/bin/npx",
      "args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
      "env": {
        "WP_API_URL": "https://tudominio.com",
        "WP_API_USERNAME": "tu-usuario",
        "WP_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx"
      }
    }
  }
}
💡 En Mac se usa la ruta completa /opt/homebrew/bin/npx a propósito: las apps de Mac no “ven” los comandos de Homebrew si pones solo “npx”.

6. Reinicia y prueba

Cierra Claude Desktop del todo con Cmd + Q y vuelve a abrirlo. La primera vez tarda unos segundos de más (descarga el conector). Luego pídele algo como “Lista mis últimas entradas de WordPress”. Si responde con tus datos, ¡conectado! 🎉

🪟 Guía completa para Windows

1. Instala Node.js

Entra en nodejs.org, descarga el instalador LTS y ejecútalo con “Siguiente, Siguiente, Finalizar”. Deja marcada la opción de añadirlo al PATH (viene marcada por defecto). Luego abre PowerShell y comprueba:

📋 Copiar
POWERSHELL (WINDOWS)
node --version

Si te devuelve un número de versión, listo 👍

2. Descarga el plugin

Igual que en Mac: WordPress MCP de Automattic. No uses el botón verde “Code”; ve a Releases en GitHub y baja wordpress-mcp.zip.

💡 No descomprimas el .zip. WordPress lo necesita tal cual.

3. Instálalo y actívalo en WordPress

En tu panel: Plugins → Añadir nuevo → Subir plugin, elige el wordpress-mcp.zip, Instalar ahora y Activar. Después, en Ajustes → MCP, activa Enable MCP functionality (imprescindible), más Enable Create Tools y Enable Update Tools. Deja Delete Tools apagado.

4. Crea una contraseña de aplicación

En Usuarios → Perfil, baja hasta Contraseñas de aplicación, ponle un nombre (“Claude Desktop”) y Añadir nueva. Cópiala: se muestra una sola vez.

⚠️ No uses tu contraseña de acceso normal, y no la pegues en ningún chat: solo va en el archivo de configuración de tu PC.

5. Configura Claude Desktop

Abre este archivo con el Bloc de notas (pega la ruta en la barra del Explorador de archivos). Si no existe, créalo:

📋 Copiar
RUTA (WINDOWS)
%APPDATA%\Claude\claude_desktop_config.json

Y pega esta configuración (cambia el dominio, el usuario y la contraseña de aplicación por los tuyos):

📋 Copiar
claude_desktop_config.json (WINDOWS)
{
  "mcpServers": {
    "wordpress-mcp": {
      "command": "npx",
      "args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
      "env": {
        "WP_API_URL": "https://tudominio.com",
        "WP_API_USERNAME": "tu-usuario",
        "WP_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx"
      }
    }
  }
}
💡 En Windows basta con poner "npx", porque el instalador de Node ya lo deja en el PATH del sistema.

6. Reinicia y prueba

Cierra Claude Desktop por completo (ciérralo también desde la bandeja del sistema, junto al reloj) y vuelve a abrirlo. La primera vez tarda unos segundos de más. Luego pídele “Lista mis últimas entradas de WordPress”. Si responde con tus datos, ¡conectado! 🎉

💡 Un par de cosas más

  • ¿No aparecen las herramientas? Repasa que el MCP esté en ON en Ajustes → MCP y reinicia Claude.
  • Para cortar el acceso en cualquier momento, borra la contraseña de aplicación “Claude Desktop” en Usuarios → Perfil. Tu contraseña normal no se toca.
  • Deja “Delete Tools” apagado: así Claude puede crear y editar, pero no borrar nada por error.

sábado, 25 de abril de 2026

Servidor local en macOS: Python vs PHP

Si estás desarrollando una web en tu Mac, antes o después necesitas verla funcionando como si estuviera en internet. Abrir el HTML con doble clic muchas veces no basta: ni se cargan los JSON, ni los formularios, ni las imágenes que vienen por fetch. Aquí te explico, paso a paso, cómo levantar un servidor local en macOS usando Python (para webs estáticas) o PHP (cuando necesitas algo más). Sin programas raros, sin entornos complicados — solo Terminal y dos comandos.

🧐 ¿Por qué necesitas un servidor local?

Cuando abres un archivo HTML haciendo doble clic, el navegador lo carga con el protocolo file://. Eso funciona para HTML simple, pero se rompe en cuanto tu web empieza a hacer cosas modernas:

  • Si tu JavaScript usa fetch() para cargar un JSON → error de CORS, el navegador lo bloquea.
  • Si tienes módulos ES (import / export) → tampoco se cargan.
  • Si quieres probar formularios con PHP → directamente no se ejecutan.
  • Si trabajas con rutas absolutas (/css/style.css) → no funcionan correctamente.

La solución es levantar un servidor HTTP en tu propia máquina, que sirva los archivos como lo haría un hosting real. Todo desde la línea de comandos. Empezamos.

⚡ Opción 1: Servidor con Python (lo más rápido)

Python viene preinstalado en macOS, así que no necesitas instalar nada. Abre Terminal y comprueba que lo tienes:

TERMINAL MAC
$ python3 --version
Python 3.x.x

Si te devuelve una versión, perfecto. Ahora navega hasta la carpeta de tu proyecto y arranca el servidor:

TERMINAL MAC
# Ve a la carpeta de tu proyecto
$ cd ~/Documentos/mi-web

# Arranca el servidor en el puerto 8000
$ python3 -m http.server 8000

Ahora abre tu navegador y entra en http://localhost:8000. Si en la carpeta hay un index.html, lo verás directamente. Si no, te aparecerá un listado de archivos.

💡 Cambiar el puerto

Si el puerto 8000 te lo está usando otra app, prueba con otro: python3 -m http.server 3000. Cualquier número entre 3000 y 9999 te vale.

🛑 Cómo parar el servidor

Mientras el servidor está activo, la Terminal queda "ocupada" mostrándote las peticiones que llegan. Para detenerlo, pulsa Ctrl + C en esa ventana.

🐘 Opción 2: Servidor con PHP (cuando necesitas más)

El servidor de Python es perfecto para webs estáticas (HTML + CSS + JavaScript + JSON), pero no ejecuta código PHP. Si abres un archivo .php con el servidor de Python, el navegador te descargará el código fuente como si fuera un texto. No es lo que queremos.

Para que PHP funcione necesitas… bueno, PHP. Y aquí viene el problema:

⚠️ macOS ya no incluye PHP

Desde macOS Monterey (2021), Apple eliminó PHP del sistema. Si pruebas php -v y te sale command not found: php, es completamente normal. Hay que instalarlo a mano.

📦 Paso previo: instalar Homebrew

Homebrew es el gestor de paquetes estándar en macOS. Sirve para instalar herramientas de desarrollo de forma limpia (sin tener que ir buscando instaladores por internet). Si no lo tienes, este es el momento.

Comprueba primero si ya está instalado:

TERMINAL MAC
$ brew --version

Si te dice Homebrew 4.x.x → pasa al siguiente paso. Si te dice command not found: brew → instálalo con este comando oficial:

TERMINAL MAC
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Te pedirá tu contraseña de Mac (la misma que usas para iniciar sesión). El proceso tarda unos minutos. Cuando acabe, léete el final del mensaje con atención: te dirá que añadas dos líneas a tu archivo ~/.zprofile para que el comando brew esté disponible. Algo así:

TERMINAL MAC
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
$ eval "$(/opt/homebrew/bin/brew shellenv)"

Cierra y abre Terminal de nuevo, y comprueba que brew --version ya te responde.

📥 Instalar PHP

Una vez tengas Homebrew funcionando, instalar PHP es un solo comando:

TERMINAL MAC
$ brew install php

Tarda entre 1 y 3 minutos. Cuando termine, comprueba que está bien:

TERMINAL MAC
$ php -v
PHP 8.4.x (cli) (built: ...)

🚀 Arrancar el servidor PHP

El comando es prácticamente igual de sencillo que el de Python. Ve a tu carpeta y lánzalo:

TERMINAL MAC
$ cd ~/Documentos/mi-web
$ php -S localhost:8000

Abre http://localhost:8000 y ya tienes un servidor que sirve HTML, CSS, JS y JSON exactamente igual que el de Python, pero además ejecuta archivos PHP.

🆚 ¿Cuál uso, Python o PHP?

Depende de lo que tenga tu proyecto. Esta es la regla simple:

Servidor HTML / CSS / JS / JSON / imágenes Ejecuta PHP
python3 -m http.server 8000 ✓ Sí ✗ No
php -S localhost:8000 ✓ Sí ✓ Sí
📌 Aclaración importante sobre JSON

"Ejecutar JSON" no existe. JSON es solo un formato de texto plano. Cualquier servidor HTTP lo sirve sin problema, da igual que sea Python, PHP, Node o Apache. Quien lo procesa es tu JavaScript, en el navegador, cuando hace fetch('data/archivo.json').

🧪 Caso real: por qué el JSON no carga al hacer doble clic

Esto es lo que le pasa a casi todo el mundo la primera vez: tienes una web bonita con un archivo resenas.json que se carga con JavaScript. Al abrir el HTML con doble clic ves el diseño pero la sección donde deberían aparecer las reseñas está vacía. Si abres la consola del navegador (Cmd + Option + I), ves un error como este:

CONSOLA NAVEGADOR
Access to fetch at 'file:///.../data/resenas.json'
from origin 'null' has been blocked by CORS policy

Eso es exactamente lo que evitas levantando un servidor local. En cuanto sirvas tu web por http://localhost:8000, el JSON se carga sin problemas. No hay que cambiar ni una línea del código: es exactamente el mismo código que funcionará luego en producción.

⚙️ Detalles que conviene saber

🔁 ¿Tengo que parar y arrancar cada vez que cambio un archivo?

No. Los cambios en HTML, CSS, JS o JSON se reflejan automáticamente al recargar la página (Cmd + R). Solo necesitas reiniciar el servidor si cambias algo de la propia configuración (puerto, carpeta raíz, etc.).

🚫 "Ya hay algo usando el puerto 8000"

Si te aparece un error tipo Address already in use, es que tienes otro servidor levantado. Cambia el número del puerto y listo:

TERMINAL MAC
$ php -S localhost:3000
# o cualquier otro puerto libre: 3001, 5500, 8080, etc.

📱 ¿Puedo verlo desde el móvil?

Sí, y es muy útil para probar el responsive. En lugar de localhost, arranca el servidor escuchando en todas las interfaces de red, y luego conéctate desde el móvil usando la IP local de tu Mac:

TERMINAL MAC
# Para Python — escucha en todas las interfaces
$ python3 -m http.server 8000 --bind 0.0.0.0

# Para PHP — sustituye 0.0.0.0 por la IP que quieras exponer
$ php -S 0.0.0.0:8000

# Y para saber tu IP local en macOS:
$ ipconfig getifaddr en0
192.168.1.45

Con ese resultado, desde el móvil entrarías en http://192.168.1.45:8000. Eso sí, el móvil tiene que estar en la misma red WiFi que el Mac.

🚦 ¿Y si quiero algo más profesional?

Lo que hemos visto es perfecto para desarrollo rápido. Pero si trabajas con WordPress, Laravel u otros proyectos que necesitan base de datos MySQL, el servidor PHP integrado se queda corto. Para esos casos hay alternativas más completas:

  • Laravel Herd — gratis, ligero, moderno. Detecta tus carpetas automáticamente y las sirve en proyecto.test. La opción más recomendable hoy en día.
  • MAMP — clásico, gratis. Entorno completo Apache + PHP + MySQL con interfaz gráfica.
  • Docker — para los que quieran replicar exactamente el entorno de producción.

Pero esto ya es harina de otro costal — lo dejamos para una próxima entrada.

✅ Resumen rápido

💡 Lo mínimo que necesitas recordar

Para una web estática (HTML, CSS, JS, JSON, imágenes): python3 -m http.server 8000.
Si tu proyecto incluye PHP: instala Homebrew, luego brew install php, y arranca con php -S localhost:8000.
En ambos casos, abre http://localhost:8000 en el navegador y a programar.

Espero que te haya servido. Si te bloqueas en algún paso, déjame un comentario y te echo una mano. 👋

• • •

viernes, 10 de abril de 2026

Cómo programar el apagado en Mac (comandos fáciles)

Cómo programar el apagado de tu Mac (aunque Apple ya no lo ponga fácil)

Si llevas tiempo con Mac, seguro que recuerdas la opción de programar el apagado. Pues bien… Apple la ha ido escondiendo hasta prácticamente hacerla desaparecer.

Pero tranquilo, sigue existiendo. Solo que ahora toca hacerlo desde Terminal 😅

💡 Te voy a enseñar varios comandos para apagar tu Mac automáticamente cuando quieras.

⚡ Apagar el Mac en X minutos

Por ejemplo, apagar en 30 minutos:

📋 Copiar
 TERMINAL MAC
sudo shutdown -h +30

👉 Cambia el número por los minutos que quieras.

🕒 Apagar el Mac a una hora concreta

Ejemplo: apagar a las 23:00

📋 Copiar
 TERMINAL MAC
sudo shutdown -h 23:00

❌ Cancelar un apagado programado

📋 Copiar
 TERMINAL MAC
sudo killall shutdown

👉 Esto cancela cualquier apagado que hayas programado antes.

🚀 Truco PRO: crear tu propio comando

Igual que con otros comandos, puedes dejarlo preparado para usarlo rápido.

1. Crear script

📋 Copiar
 TERMINAL MAC
nano ~/apagar.sh

2. Pegar esto

📋 Copiar
 TERMINAL MAC
#!/bin/bash
echo "⏳ Apagando en 30 minutos..."
sudo shutdown -h +30

3. Permisos

📋 Copiar
 TERMINAL MAC
chmod +x ~/apagar.sh

4. Convertir en comando

📋 Copiar
 TERMINAL MAC
sudo mv ~/apagar.sh /usr/local/bin/apagar30

🎯 Uso

📋 Copiar
 TERMINAL MAC
apagar30

Y listo. Sin menús ocultos ni historias raras.

💡 Consejo

  • Perfecto si dejas descargas o renders por la noche
  • Útil para ahorrar batería o energía
  • También puedes crear varios comandos: apagar15, apagar60, etc.