Back to index
Live · Case study 004

04 — Technical case study

Healthcare
clinic platform.

Theme custom para clínica con 16 plantillas service-specific y un sistema de self-bootstrapping — al activar el theme, todas las páginas se crean solas con su template asignado. Cero clicks en wp-admin.

Role
Engineer · Client work
Year
2025
Status
Live · production
Scope
Theme · Templates · Bootstrapping
Stack
WordPress · PHP · Tailwind
Sector
Healthcare · Clinic · NDA

01

Pattern.

Theme-as-installer

El theme es el instalador. Activarlo = web completa, lista para producción, sin un solo clic en el admin.

  1. 01

    Self-bootstrapping pages

    Al activar el theme se ejecuta bernad_create_*_page() en el hook after_setup_theme. Cada función comprueba si la página existe (get_page_by_path); si no, la crea con wp_insert_post y le asigna el template via _wp_page_template meta. Cero pasos manuales — instalas el theme y la web está completa.

  2. 02

    Service-specific templates

    12 plantillas dedicadas, una por especialidad médica: page-implantologia.php, page-endodoncia.php, page-ortodoncia.php, page-cirugia-oral.php, etc. Cada una con copy, hero, FAQs y schema propios. Mantenibilidad por separación clara de concerns.

  3. 03

    Institutional pages module

    4 plantillas adicionales para "instalaciones", "tecnología", "equipo", "sobre-nosotros" — ciclo idéntico de auto-creación con su template asignado. Toda la arquitectura de información codificada en el theme, no en wp-admin.

  4. 04

    DRY page-creation helper

    Función reusable bernad_create_page_if_not_exists($slug, $title, $template) abstrae el patrón. Las funciones de servicios e info iteran sobre arrays de configuración y delegan al helper. Añadir una nueva especialidad = una línea en el array.

  5. 05

    Permalinks auto-flush

    Al crear/asignar las páginas se programa un flush_rewrite_rules diferido para garantizar URLs limpias (/implantologia/, /endodoncia/) sin requerir intervención del admin en Settings → Permalinks.

02

Signal.

The bootstrapping pattern

functions.php · service pages bootstrap

function bernad_create_page_if_not_exists(
    $slug, $title, $template_name
) {
    if (get_page_by_path($slug)) return;

    $page_id = wp_insert_post([
        'post_title'   => $title,
        'post_name'    => $slug,
        'post_status'  => 'publish',
        'post_type'    => 'page',
    ]);

    if ($page_id && $template_name) {
        update_post_meta(
            $page_id, '_wp_page_template', $template_name
        );
    }
}

function bernad_create_service_pages() {
    $services = [
        'implantologia'    => ['Implantología',    'page-implantologia.php'],
        'endodoncia'       => ['Endodoncia',       'page-endodoncia.php'],
        'ortodoncia'       => ['Ortodoncia',       'page-ortodoncia.php'],
        // ... 9 more specialties
    ];

    foreach ($services as $slug => $data) {
        bernad_create_page_if_not_exists(
            $slug, $data[0], $data[1]
        );
    }
}
add_action('after_setup_theme', 'bernad_create_service_pages');

03

Templates.

16 dedicated pages

Especialidades clínicas

  • Implantología
  • Odontopediatría
  • Endodoncia
  • Prótesis
  • Estética dental
  • Cirugía oral
  • Periodoncia
  • Odontología restauradora
  • Sedación
  • Blanqueamiento dental
  • Ortodoncia

Institucionales

  • Instalaciones
  • Tecnología
  • Equipo
  • Sobre nosotros
  • Nuestra historia
  • Servicios (hub)

Operacionales

  • Financiación
  • 404 personalizado
  • Header / Footer compartidos
  • Functions central
  • JS + media propios

04

Stack.

Minimal · zero build complexity

Core

  • WordPress
  • PHP
  • Tailwind CSS
  • Custom theme

Templates

  • 16 page templates
  • Service-by-service
  • Shared header/footer
  • Auto-bootstrap

Conventions

  • DRY helper functions
  • Config-array driven
  • after_setup_theme hooks
  • Permalink flush automation

End of case study

Need a similar
build-and-ship?