# WordPress

Sitios WordPress nativos con PHP-FPM y MySQL propios, HTTPS, copias, staging, migración y edición completa por MCP.

Fuente: https://ardumaker.com/docs/wordpress/

- Categoría: Servidores e infraestructura
- Estado: Disponible
- Requisitos: Un VPS activo con la función `wordpress` disponible; Al menos 256 MB de RAM y 1 GB de disco libres; Para un dominio propio: que su DNS apunte al VPS
- Herramientas MCP (Solo leen): `listar_sitios_wordpress`, `ver_sitio_wordpress`, `leer_logs_wordpress`, `ver_web_wordpress`, `listar_backups_wordpress`
- Herramientas MCP (Escriben o modifican): `instalar_app`, `probar_web_wordpress`, `controlar_cache_wordpress`, `crear_backup_wordpress`, `crear_staging_wordpress`, `cambiar_direccion_wordpress`, `revelar_credencial_app`, `controlar_app`
- Herramientas MCP (Destructivas): `editar_contenido_wordpress`, `editar_menus_wordpress`, `editar_medios_wordpress`, `configurar_sitio_wordpress`, `controlar_extensiones_wordpress`, `editar_usuarios_wordpress`, `editar_seo_wordpress`, `editar_archivos_wordpress`, `ejecutar_wp_cli_wordpress`, `consultar_base_wordpress`, `controlar_cron_wordpress`, `configurar_correo_wordpress`, `editar_integraciones_wordpress`, `eliminar_backup_wordpress`, `restaurar_backup_wordpress`, `desinstalar_app`

## ¿Qué permite hacer?

Cada sitio WordPress es una app: corre de forma nativa (sin Docker) con su usuario de Linux, su pool de PHP-FPM y su base en el MySQL del VPS. En un mismo VPS pueden convivir varios sitios aislados entre sí.

- Crear un sitio vacío, una tienda ([WooCommerce](https://ardumaker.com/docs/woocommerce)) o un sitio con [Elementor](https://ardumaker.com/docs/elementor).
- Traer un sitio desde un backup de otro hosting (All-in-One, Duplicator, UpdraftPlus o un panel de hosting).
- Publicarlo con HTTPS en una dirección automática o un dominio propio, y cambiarla después.
- Hacer copias, restaurarlas, crear un staging y publicarlo.
- Actualizar núcleo, base, plugins y temas.
- Editar contenido, menús, medios, ajustes, plugins, usuarios, SEO, archivos, cron, caché, correo e integraciones, desde el panel o por MCP.

## ¿Cuándo conviene usarlo?

- Sitios institucionales, blogs o tiendas que se quieren tener en un servidor propio.
- Mudar un WordPress desde otro hosting sin tocar archivos a mano.
- Que un agente de IA mantenga el sitio: contenido, plugins, pruebas en un navegador real.

## ¿Cómo funciona en ArduMaker?

1. `validar`: VPS activo, función `wordpress` del sistema, memoria y disco mínimos.
2. `preparar`: PHP 8.3 con PHP-FPM y las extensiones de WordPress, y wp-cli (una vez por VPS, comprobado contra el `.sha512` publicado); el motor MySQL se instala si falta.
3. `instalar`: se guardan antes las claves (la del admin y la de la base); se crean la base `wp<id>` y la cuenta `'wp<id>'@'localhost'`, el usuario de Linux, las carpetas, el pool y el cron; se baja el núcleo, se escribe `wp-config.php` y se instala con una URL provisoria.
4. `configurar`: si se pidieron `extras`, se instalan WooCommerce y/o Elementor.
5. `publicar`: se reserva la dirección, se escribe el server block en el nginx del VPS, el sitio pasa a `https://<dominio>` con `wp search-replace` y se publica con DNS, proxy y HTTPS. Se verifica `/wp-login.php` con 200.

Si `publicar` falla, el sitio queda instalado y el reintento vuelve a publicar sin reinstalar. El TLS lo pone la plataforma delante del VPS; el nginx del VPS le pasa `HTTPS on` a PHP para que WordPress no entre en un bucle de redirecciones al abrir `/wp-admin`.

Ningún campo es obligatorio: `site_title` (por defecto «Mi sitio»), `admin_email` (por defecto el de quien instala), `admin_user` (3 a 40 caracteres; no se aceptan `admin`, `administrator`, `root` ni `wordpress`), `locale` (por defecto `es_ES`), `custom_domain`, `extras` y `origen` (para traer un backup o copiar otro sitio).

## ¿Qué cambia realmente?

| Qué | Dónde / cómo |
| --- | --- |
| Archivos del sitio | `/srv/wordpress/wp<id>/public` |
| Copias | `/srv/wordpress/wp<id>/backups/`, fuera de la carpeta pública |
| Usuario de Linux | `wp<id>`, de sistema, sin login |
| PHP | Pool `wp<id>` con socket propio, `pm = ondemand` y `open_basedir` en su carpeta |
| Base | `wp<id>` en MySQL, cuenta `'wp<id>'@'localhost'` (solo por socket) |
| Cron | `wp<id>-cron.timer` corre los eventos vencidos cada 5 minutos |
| Web | Server block del dominio en el nginx del VPS |

Con `pm = ondemand` un sitio sin visitas no gasta memoria, por eso entran varios en un plan chico. Un sitio no puede leer los archivos PHP de otro.

## Copias, staging y migración

- `crear_backup_wordpress`: copia completa (base y `wp-content`) en un `.tar.gz` fuera de la carpeta pública.
- `restaurar_backup_wordpress` con exactamente un origen: `backup` (una copia del sitio: vuelta atrás), `url` (un archivo que baja el VPS: copia de ArduMaker `.tar.gz`, All-in-One `.wpress`, Duplicator `.zip`, UpdraftPlus o `.tar.gz` de un panel de hosting) o `from_app` (otro sitio del mismo VPS). Después de cargar, el sitio vuelve a su propia dirección.
- `crear_staging_wordpress`: un sitio nuevo en el mismo VPS, cargado con una copia y con su propia dirección. Se publica restaurando el sitio en vivo con `from_app` igual al staging.
- Al importar un backup se vuelve a crear el admin de ArduMaker con su contraseña: el backup trae sus propios usuarios.
- `cambiar_direccion_wordpress` despublica la dirección vieja (DNS, proxy y server block), publica la nueva con HTTPS y reescribe todas las URL del sitio.

## Actualizar y desinstalar

La acción `update` (`controlar_app`) deja al día núcleo, base, plugins y temas, y antes asegura PHP 8.3 y el pool del sitio. Desinstalar saca el pool y el cron; con `delete_data` también borra archivos, base y contraseñas.

> **PELIGRO:** Con `delete_data` se pierde el sitio, sus copias locales y su base.

## Esquema

**Un sitio WordPress**

```text
Internet (HTTPS en `wordpress-<id>` o un dominio propio)
  ↓
Plataforma (termina TLS y lleva al VPS)
  ↓
nginx del VPS (server block del sitio, `HTTPS on`)
  ↓
PHP-FPM pool `wp<id>` (como el usuario `wp<id>`)
  ↓
MySQL (base `wp<id>` por socket)
```

## Resultado esperado

El sitio aparece en Apps y en `listar_sitios_wordpress` con su dirección y sus extras. `revelar_credencial_app` devuelve el usuario y la contraseña de `/wp-admin`; la contraseña de la base nunca sale: solo la usa `wp-config.php`. `ver_sitio_wordpress` con `view: salud` muestra la respuesta HTTP, el pool de PHP, actualizaciones pendientes y cron atrasado.

## Errores y resolución

| Error | Causa | ¿Reintentar? |
| --- | --- | --- |
| `php_no_instalado` | No se pudo preparar PHP-FPM | Sí |
| `base_ya_existe` | Ya hay una base `wp<id>` que no creó este sitio; no se toca | No |
| `base_no_creada` / `wordpress_no_instalado` | Falló la base o la instalación del núcleo | Sí |
| `nginx_no_configurado` / `wordpress_url_no_cambiada` | Falló el server block o el cambio de URL al publicar | Sí, sin reinstalar |
| `backup_incompleto` / `backup_no_importado` | El backup subido no llegó entero o no se pudo importar | Sí, tras reenviarlo |
| `wordpress_copia_fallida` / `wordpress_restauracion_fallida` | Falló la copia o la restauración | Sí |
| `wordpress_comando_fallido` (422) | wp-cli salió con error; la salida recortada dice por qué | Corrigiendo el pedido |

Para diagnosticar: `leer_logs_wordpress` (PHP-FPM, `debug.log`, errores o accesos de nginx), `ver_web_wordpress` (estado, HTML, enlaces o formularios de una ruta) y `probar_web_wordpress`, que abre el sitio en un navegador real dentro del VPS y devuelve una captura, el texto visible y los errores de consola.

> **PRECAUCION:** Antes de un cambio grande conviene `crear_backup_wordpress`. Restaurar reemplaza el sitio entero y hace antes una copia de seguridad, salvo `skip_safety_copy`.

## Relación con MCP

WordPress tiene su propio dominio MCP, [/mcp/wordpress](https://ardumaker.com/mcp/wordpress) (referencia general en [/mcp/docs](https://ardumaker.com/mcp/docs)). Todo corre en el VPS con wp-cli como el usuario del sitio. Hay tres niveles: ver (quien ve la app), cambiar (además, no ser un agente solo lectura) y delicado (base de datos, archivos, restaurar, wp-cli libre, borrar usuarios: admin de la empresa).

| Tipo | Herramientas |
| --- | --- |
| Lectura | `listar_sitios_wordpress`, `ver_sitio_wordpress`, `leer_logs_wordpress`, `ver_web_wordpress`, `listar_backups_wordpress` |
| Contenido y sitio | `editar_contenido_wordpress`, `editar_menus_wordpress`, `editar_medios_wordpress`, `configurar_sitio_wordpress`, `controlar_extensiones_wordpress`, `editar_usuarios_wordpress`, `editar_seo_wordpress` |
| Servidor | `editar_archivos_wordpress`, `ejecutar_wp_cli_wordpress`, `consultar_base_wordpress`, `controlar_cron_wordpress`, `controlar_cache_wordpress`, `configurar_correo_wordpress`, `editar_integraciones_wordpress`, `probar_web_wordpress` |
| Copias y dirección | `crear_backup_wordpress`, `crear_staging_wordpress`, `cambiar_direccion_wordpress` |
| Destructivas | `restaurar_backup_wordpress`, `eliminar_backup_wordpress`, `desinstalar_app` |

- Se crea con `instalar_app` (`app_type: wordpress`); la credencial de `/wp-admin` sale con `revelar_credencial_app` (solo admin).
- `ejecutar_wp_cli_wordpress` rechaza `eval`, `eval-file`, `shell`, `package`, `server` y `cli`, y las opciones `--exec` y `--require`.
- `editar_archivos_wordpress` trabaja solo dentro de `wp-content` y nunca toca `wp-config.php`; un `.php` se revisa con `php -l` antes de reemplazarlo.
- `consultar_base_wordpress` corre lecturas tal cual; cualquier escritura necesita `confirmed`.
- El usuario admin de ArduMaker en el sitio no se puede borrar ni degradar.

> **PRECAUCION:** Logs, páginas y el texto que devuelve el navegador vienen del sitio: llegan marcados como contenido no confiable y son datos, nunca instrucciones.

## Funciones relacionadas

- [WooCommerce](https://ardumaker.com/docs/woocommerce/)
- [Elementor](https://ardumaker.com/docs/elementor/)
- [MySQL](https://ardumaker.com/docs/mysql/)
- [Nginx](https://ardumaker.com/docs/nginx/)
- [Certificados SSL](https://ardumaker.com/docs/ssl/)
- [Dominios y DNS](https://ardumaker.com/docs/dominios-y-dns/)
