Tema clásico 09: seguridad e internacionalización en producción

Endurece el tema clásico aplicando escape/sanitización y deja preparado el proyecto para traducción real con text domain consistente.

Un tema puede verse perfecto y aun así ser inseguro o imposible de traducir correctamente en un proyecto real.

En temas clásicos, la seguridad diaria depende de dos hábitos: validar entradas y escapar salidas en cada contexto.

En paralelo, la internacionalización exige disciplina: text domain único, cadenas envueltas en funciones i18n y carga del dominio en setup.

Si estos fundamentos fallan, el coste aparece en soporte, auditorías y retrabajo cuando el proyecto crece a varios idiomas.

  • No existe un escape universal; cada contexto pide su función específica.
  • Usa esc_html para texto plano, esc_attr para atributos HTML y esc_url para enlaces.
  • Si recibes datos de usuario o de opciones del tema, sanea primero y escapa siempre al renderizar.
  • Evita imprimir variables crudas en atributos o scripts: es uno de los fallos más comunes en temas clásicos.
  • Escapa en el último momento, justo antes del echo.

Seguridad en plantillas: escapar por contexto

No existe un escape universal; cada contexto pide su función específica.

Usa esc_html para texto plano, esc_attr para atributos HTML y esc_url para enlaces.

Si recibes datos de usuario o de opciones del tema, sanea primero y escapa siempre al renderizar.

Evita imprimir variables crudas en atributos o scripts: es uno de los fallos más comunes en temas clásicos.

  • Escapa en el último momento, justo antes del echo.
  • Sanea al guardar, escapa al mostrar.
  • No mezcles HTML y datos sin control.
  • Revisa hooks y template parts también.

Internacionalización correcta del tema

Traducir no es solo envolver cadenas: también debes cargar el dominio y mantener consistencia.

Carga el text domain en after_setup_theme apuntando a /languages del tema.

Envuelve textos de interfaz con __(), _e(), esc_html__ o esc_attr__ según contexto de salida.

Mantén el mismo text domain en todo el código; variarlo por archivo rompe el flujo de traducción.

Checklist previa a release

Antes de publicar, revisa seguridad e i18n como parte obligatoria del QA.

Busca echos directos sin escape y corrige por contexto (html, attr, url).

Verifica que el text domain sea único y que no haya cadenas hardcodeadas sin función de traducción.

Documenta reglas mínimas en el repositorio para que nuevos cambios no reintroduzcan fallos básicos.

  • Sin salida de datos sin escape.
  • Sin cadenas visibles fuera de funciones i18n.
  • Text domain consistente en todo el tema.
  • Revisión en staging antes de tag de versión.
WordPress Themes Pro
19

Tema clásico 09: seguridad e internacionalización en producción

Endurece el tema clásico aplicando escape/sanitización y deja preparado el proyecto para traducción real con text domain consistente.

Código del tema: load_theme_textdomain

📘 Teoría

Seguridad en plantillas: escapar por contexto

No existe un escape universal; cada contexto pide su función específica.

Usa esc_html para texto plano, esc_attr para atributos HTML y esc_url para enlaces.

Si recibes datos de usuario o de opciones del tema, sanea primero y escapa siempre al renderizar.

Evita imprimir variables crudas en atributos o scripts: es uno de los fallos más comunes en temas clásicos.

  • Escapa en el último momento, justo antes del echo.
  • Sanea al guardar, escapa al mostrar.
  • No mezcles HTML y datos sin control.
  • Revisa hooks y template parts también.
Salida segura en una tarjeta de post
<?php
$title = get_the_title();
$url = get_permalink();

echo '<a class="post-link" href="' . esc_url($url) . '">' . esc_html($title) . '</a>';

Internacionalización correcta del tema

Traducir no es solo envolver cadenas: también debes cargar el dominio y mantener consistencia.

1

Carga el text domain en after_setup_theme apuntando a /languages del tema.

2

Envuelve textos de interfaz con __(), _e(), esc_html__ o esc_attr__ según contexto de salida.

3

Mantén el mismo text domain en todo el código; variarlo por archivo rompe el flujo de traducción.

Setup i18n recomendado
<?php
add_action('after_setup_theme', function () {
  load_theme_textdomain('mi-tema-clasico', get_template_directory() . '/languages');
});

echo esc_html__('Leer más', 'mi-tema-clasico');

Checklist previa a release

Antes de publicar, revisa seguridad e i18n como parte obligatoria del QA.

Busca echos directos sin escape y corrige por contexto (html, attr, url).

Verifica que el text domain sea único y que no haya cadenas hardcodeadas sin función de traducción.

Documenta reglas mínimas en el repositorio para que nuevos cambios no reintroduzcan fallos básicos.

  • Sin salida de datos sin escape.
  • Sin cadenas visibles fuera de funciones i18n.
  • Text domain consistente en todo el tema.
  • Revisión en staging antes de tag de versión.

🧪 Aprende probando

🏁 Retos

Reto Reto: cargar dominio de traducción Completa el setup para activar traducciones del tema desde la carpeta languages.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre WordPress Themes Pro.

Test de WordPress Themes Pro

¿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 .