CPT y metaboxes: modelar contenido del plugin de forma escalable

Creas un Custom Post Type para reglas de aviso y metaboxes seguras para gestionar su comportamiento sin depender solo de opciones globales.

Cuando tu plugin empieza a manejar reglas complejas, guardar todo en una opción global se vuelve un cuello de botella.

En esta lección pasarás a un modelo más escalable: un CPT para reglas de aviso y metadatos por elemento.

Así cada regla tendrá su ciclo editorial (borrador, publicación, revisión) y podrás mantener histórico sin sobrescribir configuraciones.

Este enfoque también prepara el terreno para filtros, listados y edición avanzada desde WordPress admin.

  • Un CPT mal definido genera fricción editorial y deuda técnica.
  • Para WP Avisos Contextuales, crea un CPT `wpac_rule` donde cada entrada representa una regla: mensaje, tono, audiencia y contexto.
  • Decide desde el inicio qué campos serán título/contenido y cuáles vivirán en meta (por ejemplo prioridad, fecha de expiración o segmentación).
  • Caso real: equipos que no modelan bien terminan duplicando reglas y perdiendo trazabilidad de cambios.
  • Entidad clara: una entrada = una regla.

Diseña el modelo antes del código

Un CPT mal definido genera fricción editorial y deuda técnica.

Para WP Avisos Contextuales, crea un CPT `wpac_rule` donde cada entrada representa una regla: mensaje, tono, audiencia y contexto.

Decide desde el inicio qué campos serán título/contenido y cuáles vivirán en meta (por ejemplo prioridad, fecha de expiración o segmentación).

Caso real: equipos que no modelan bien terminan duplicando reglas y perdiendo trazabilidad de cambios.

  • Entidad clara: una entrada = una regla.
  • Campos de control en meta.
  • Estados editoriales para gobernanza.

Registrar CPT con argumentos pensados para admin real

No dejes `register_post_type` en valores por defecto.

Define labels legibles para equipo no técnico, `show_in_rest` según tu estrategia de editor/bloques y `supports` solo con lo necesario.

Si no necesitas URL pública del CPT, desactiva `publicly_queryable` y revisa `has_archive` para evitar exposición accidental.

Usa `capability_type` y `map_meta_cap` cuando quieras un control más fino de permisos.

Metabox segura: render limpio y guardado robusto

El peligro no está en mostrar el campo, está en guardarlo sin control.

Renderiza metabox con `wp_nonce_field` y escapa siempre valores actuales en inputs.

En `save_post_wpac_rule` aplica secuencia defensiva: autosave check, nonce check, capacidad y sanitización.

Guarda solo cambios válidos y evita lógica pesada en el hook de guardado.

Caso real: reglas en conflicto por falta de prioridad

Cuando dos reglas aplican al mismo contexto necesitas resolución determinista.

En un sitio con campañas, dos reglas activas se solapaban en la misma URL y el equipo no sabía cuál debía mostrarse.

La solución fue añadir campo meta `priority` y ordenar resolución por valor numérico + fecha de creación.

Modelar ese campo en el CPT evitó parches manuales y mejoró previsibilidad.

WordPress Plugin
08

CPT y metaboxes: modelar contenido del plugin de forma escalable

Creas un Custom Post Type para reglas de aviso y metaboxes seguras para gestionar su comportamiento sin depender solo de opciones globales.

Código del tema: add_meta_box

📘 Teoría

Diseña el modelo antes del código

Un CPT mal definido genera fricción editorial y deuda técnica.

Para WP Avisos Contextuales, crea un CPT `wpac_rule` donde cada entrada representa una regla: mensaje, tono, audiencia y contexto.

Decide desde el inicio qué campos serán título/contenido y cuáles vivirán en meta (por ejemplo prioridad, fecha de expiración o segmentación).

Caso real: equipos que no modelan bien terminan duplicando reglas y perdiendo trazabilidad de cambios.

  • Entidad clara: una entrada = una regla.
  • Campos de control en meta.
  • Estados editoriales para gobernanza.

Registrar CPT con argumentos pensados para admin real

No dejes `register_post_type` en valores por defecto.

1

Define labels legibles para equipo no técnico, `show_in_rest` según tu estrategia de editor/bloques y `supports` solo con lo necesario.

2

Si no necesitas URL pública del CPT, desactiva `publicly_queryable` y revisa `has_archive` para evitar exposición accidental.

3

Usa `capability_type` y `map_meta_cap` cuando quieras un control más fino de permisos.

Registro recomendado de CPT
add_action('init', function (): void {
    register_post_type('wpac_rule', [
        'labels' => [
            'name' => 'Reglas de aviso',
            'singular_name' => 'Regla de aviso',
        ],
        'public' => false,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_rest' => true,
        'supports' => ['title'],
        'menu_icon' => 'dashicons-warning',
    ]);
});

Metabox segura: render limpio y guardado robusto

El peligro no está en mostrar el campo, está en guardarlo sin control.

Renderiza metabox con `wp_nonce_field` y escapa siempre valores actuales en inputs.

En `save_post_wpac_rule` aplica secuencia defensiva: autosave check, nonce check, capacidad y sanitización.

Guarda solo cambios válidos y evita lógica pesada en el hook de guardado.

1

Checklist de guardado

Cada vez que persistas metadatos.

  • Comprobar `DOING_AUTOSAVE`.
  • Verificar nonce.
  • Validar capacidad y sanear.
2

Errores típicos

Lo que rompe reglas en producción.

  • Guardar sin nonce.
  • No filtrar valores permitidos.
  • Actualizar meta en revisiones/autosaves.

Caso real: reglas en conflicto por falta de prioridad

Cuando dos reglas aplican al mismo contexto necesitas resolución determinista.

1

En un sitio con campañas, dos reglas activas se solapaban en la misma URL y el equipo no sabía cuál debía mostrarse.

2

La solución fue añadir campo meta `priority` y ordenar resolución por valor numérico + fecha de creación.

3

Modelar ese campo en el CPT evitó parches manuales y mejoró previsibilidad.

🧪 Aprende probando

Ejemplo Ejemplo guiado: CPT de reglas + metabox de tono y audiencia Registramos CPT y metabox con guardado seguro en `save_post_wpac_rule`.

🏁 Retos

Reto Reto real: añade campo `priority` con validación numérica Extiende metabox y guardado para resolver conflictos entre reglas.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .