Etapa 3: Build (Construcción)
Objetivo: el sitio funciona localmente. Los elementos reales se renderizan mediante funciones del núcleo. Las consultas se guardan, luego se reenvían, luego se purgan. Las pruebas de estructura están en verde.
Lee primero: el AGENTS.md del proyecto, luego references/architecture.md.
Pasos
- Sitio local. Sigue la sección "Primera ejecución" del
README.mddel proyecto. Luego verifica:ddev wp eval 'echo wp_get_environment_type();'debe imprimirlocal. Si no es así, consultareferences/local-env.md. Hasta que imprimalocal, el sitio piensa que está en producción: puede ser indexado y puede enviar correos a clientes reales. - Renombra el tipo de contenido de ejemplo. Hazlo antes de que exista contenido.
<prefix>_offerse convierte en la palabra del negocio (tour, servicio, curso): el tipo de post, el slug de reescritura y las etiquetas enmodules/content.php, además de los nombres de funciones (_get_offers,_render_offer_card), el archivoparts/offer-card.phpy las pruebas. Los nombres de tipos de post tienen un límite de 20 caracteres. - Modela el contenido. Encuentra todos los campos que necesita el brief. Registra cada uno como metadato de post con un callback de saneamiento y un callback de autorización. Los precios son números en metadatos. 0 significa "bajo consulta", nunca "gratis". Si los editores necesitan pantallas de campos más enriquecidas, añade ACF (gratuito) encima, pero lee los valores solo a través de funciones del núcleo.
- Archivos de datos → generador (cuando el propietario proporciona muchos elementos):
- mantén un archivo Markdown o JSON por elemento en
docs/data/<type>/; - escribe un script WP-CLI idempotente que cree o actualice publicaciones a partir de esos archivos;
- asígnale un
--dry-run; - ejecútalo con
ddev wp eval-file - < scripts/<name>.php. Los archivos son la verdad revisable; la BD es la copia.
- mantén un archivo Markdown o JSON por elemento en
- Las plantillas llaman a una función del núcleo por sección.
- El layout vive en el tema: plantillas,
parts/, anulaciones de skin. - Los datos, consultas, precios, frases de política y formularios vienen del núcleo.
- Protege cada llamada con
function_exists(), para que una plantilla nunca falle si falta el plugin.
- El layout vive en el tema: plantillas,
- Consultas. Mantén el pipeline en
modules/enquiry.php(references/forms-and-leads.md).- Añade campos en tres lugares a la vez: el formulario, el manejador y la caja de detalles.
- Configura la bandeja de entrada y el remitente en constantes de
wp-config.php, nunca en código.
- Texto de políticas (términos, depósitos, cancelación): colócalo en el núcleo como una función (por ejemplo
<prefix>_policy( 'cancellation' )). Las plantillas imprimen esa función, y una prueba falla si una plantilla hardcodea una frase de política. - ¿Nuevo módulo? Añade un archivo en
modules/, una línearequire_onceen el bootstrap, y actualizatests/structure/core.spec.tsen el mismo commit. - Verifica y haz commit.
- Ejecuta
npm run test:structureynpm run lint:php(0 errores). - Pídele al agente wp-rules-reviewer que revise el diff.
- Haz commit (Conventional Commits).
- Ejecuta
Puerta (marca en SITE_STATUS.md)
-
wp_get_environment_type()= local - Plugin central y tema hijo activos; skin cargado
- Elementos reales renderizados mediante funciones del núcleo; sin cards, precios o slugs hardcodeados
- Consulta: guardada → enviada por correo → reintento → purga; probada de extremo a extremo en Mailpit
- Pruebas de estructura en verde; PHPCS 0 errores
Nunca
- Lógica de negocio,
WP_Query, precios, llamadaspll_*o texto de política en el tema. $_POSTo$_GETsinwp_unslash+ una función de saneamiento; salida sinesc_*.- Claves de API o endpoints de terceros en HTML o JS. Reenvía desde el servidor.
- Activar módulos de plugins con
wp option updatesin procesar. Usa la UI o CLI del propio plugin, luego vuelve a revisar cada página que afecte. - Funciones, opciones, hooks, claves de metadatos o nonces sin prefijo.