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.
- 01
Self-bootstrapping pages
Al activar el theme se ejecuta
bernad_create_*_page()en el hookafter_setup_theme. Cada función comprueba si la página existe (get_page_by_path); si no, la crea conwp_insert_posty le asigna el template via_wp_page_templatemeta. Cero pasos manuales — instalas el theme y la web está completa. - 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. - 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.
- 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. - 05
Permalinks auto-flush
Al crear/asignar las páginas se programa un
flush_rewrite_rulesdiferido 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