Traducir plugins de WordPress que no tienen traducción al español (YITH Affiliates y Wishlist)
Hola, amigos de Piensa para Crear. 👋
Si trabajas con WordPress y plugins premium, seguramente te ha pasado: un plugin no tiene traducción al español, o la tiene incompleta, y no hay forma de traducirlo desde el panel de WordPress.
Esto es especialmente común con plugins de YITH (Affiliates, Wishlist, WooCommerce Wishlist) en sus versiones Pro. Traducen algunas cosas, pero dejan otras en inglés, y el resultado es una tienda con textos mezclados que confunde al cliente.
Después de investigar durante mucho tiempo, encontré que la mejor solución es añadir código en el functions.php de tu tema para traducir cada palabra o frase que el plugin no traduce.
En este post te explico cómo hacerlo con un ejemplo real: YITH Affiliates Pro y YITH Wishlist Pro.
🧠 ¿Por qué los plugins no se traducen solos?
WordPress usa archivos .po y .mo para las traducciones. Los plugins bien hechos incluyen estos archivos con las traducciones oficiales.
Pero hay varios escenarios donde la traducción falla:
El plugin es premium y no incluye traducción al español.
La traducción está incompleta (traducen el frontend pero no el backend).
El plugin se actualiza y las nuevas cadenas no tienen traducción.
Usas un plugin de traducción como Loco Translate, pero algunas cadenas están "atrapadas" en JavaScript y no se pueden traducir así.
En estos casos, la solución más efectiva es interceptar las cadenas con los filtros gettext y ngettext de WordPress y reemplazarlas por las que tú quieras.
🛠️ El código: traducir cadenas específicas de cualquier plugin
Este fragmento se coloca en el archivo functions.php de tu tema hijo (nunca en el tema padre).
function sustitucion_textos_predefinidos($traduccion){ $palabras = array( // YITH Affiliates Pro 'Become an affiliate' => 'Hazte afiliado', 'and share it anywhere' => 'y compártela en cualquier lugar', "You're just one step away from becoming an affiliate!" => '¡Estás a solo un paso de convertirte en afiliad@!', 'From your affiliate dashboard you can view your recent commissions and visits, consult your affiliate stats and ' => 'Desde tu panel de afiliados puedes ver tus comisiones y visitas recientes, consultar tus estadísticas de afiliados y ', 'manage settings' => 'administrar la configuración', 'for your profile' => 'de tu perfil', 'ITEMS PER PAGE' => 'ARTÍCULOS POR PÁGINA', 'Sign out' => 'Cerrar sesión', 'Stats' => 'Estadísticas', 'Affiliate rate' => 'Tasa de afiliado', 'Total Earnings' => 'Ganancias totales', 'Total Paid' => 'Total pagado', 'Total Refunded' => 'Total reembolsado', 'Balance' => 'Saldo', 'Visits' => 'Visitas', 'Conversion rate' => 'Tasa de conversión', 'Dashboard' => 'Panel', 'Payments' => 'Pagos', 'Generate Link' => 'Generar enlace', 'Created at' => 'Creado el', 'Completed at' => 'Completado el', 'Invoice' => 'Factura', 'There are no registered Pagos yet' => 'Aún no hay pagos registrados', 'Your affiliate ID is' => 'Tu ID de afiliado es', 'Your referral URL is' => 'Tu URL de referencia es', 'Enter any URL' => 'Ingresa cualquier URL', 'this site into the form below to' => 'este sitio en el siguiente formulario para', 'your referral' => 'tu referencia', 'to that page' => 'a esa página', 'Now' => 'Ahora', 'Copy' => 'Copiar', 'this referral' => 'esta referencia', 'PAGE URL' => 'URL DE LA PÁGINA', 'REFERRAL URL' => 'URL DE REFERENCIA', 'Generate' => 'Generar', 'Share on' => 'Compartir en', 'Settings' => 'Ajustes', 'Recent Commissions' => 'Comisiones recientes', 'View all' => 'Ver todo', 'Sorry!' => '¡Lo sentimos!', 'Recent Clicks' => 'Clics recientes', 'Status' => 'Estado', 'There are no registered commissions yet' => 'Aún no hay comisiones registradas', 'Commissions' => 'Comisiones', 'Rate' => 'Tasa', 'Amount' => 'Monto', 'Link' => 'Enlace', 'Origin' => 'Origen', 'Date' => 'Fecha', 'Product' => 'Producto', 'From' => 'Desde', 'Filter' => 'Filtrar', 'Hello' => 'Hola', 'Personal info' => 'Información personal', 'PAYMENT EMAIL' => 'CORREO DE PAGO', 'Email address where you want' => 'Dirección de correo donde quieres', 'receive PayPal Pagos for' => 'recibir pagos de PayPal para', 'NOTIFY ON NEW' => 'NOTIFICAR SOBRE NUEVAS', 'Select this option if you want' => 'Selecciona esta opción si quieres', 'be emailed each time a commission' => 'recibir un correo cada vez que una comisión', 'switches to' => 'cambie a', 'pending' => 'pendiente', 'NOTIFY ON COMMISSION PAID' => 'NOTIFICAR SOBRE COMISIÓN PAGADA', 'be emailed each time a commission is paid' => 'recibir un correo cada vez que se pague una comisión', 'Submit' => 'Enviar', 'is paid' => 'es pagada', 'Changes correctly saved!' => '¡Cambios guardados correctamente!', // YITH Wishlist Pro 'My puntos' => 'Mis puntos', 'Back to all wishlists' => 'Volver a todas las listas de deseos', 'Back to all Lista de deseoss' => 'Volver a todas las listas de deseos', 'APPLY THIS ACTION TO ALL THE SELECTED ITEMS' => 'APLICA ESTA ACCIÓN A TODOS LOS ELEMENTOS SELECCIONADOS', 'name' => 'nombre', 'Unit price' => 'Precio unitario', 'Quantity' => 'Cantidad', 'Stock' => 'Existencias', 'Added on' => 'Añadido el', 'Remove' => 'Eliminar', 'Add to cart' => 'Añadir al carrito', 'Remove to wishlist' => 'Quitar de la lista de deseos', 'Apply' => 'Aplicar', 'Update' => 'Actualizar', 'UpFecha' => 'Actualizar', 'this wishlist' => 'esta lista de deseos', 'Create a wishlist' => 'Crear una lista de deseos', 'Your wishlists' => 'Tus listas de deseos', 'Search wishlist' => 'Buscar lista de deseos', 'Ask for an' => 'Solicitar un', 'Add All To Cart' => 'Añadir todo al carrito', 'Estimate' => 'Presupuesto', 'Privacy' => 'Privacidad', 'Count of items' => 'Número de artículos', 'Created on' => 'Creado el', 'PDF Download' => 'Descargar PDF', 'Delete' => 'Eliminar', 'Public' => 'Pública', 'Shared' => 'Compartida', 'Private' => 'Privada', 'items' => 'artículos', 'Wishlist' => 'Lista de deseos', ); $traduccion = str_ireplace(array_keys($palabras), $palabras, $traduccion); return $traduccion; } add_filter('gettext', 'sustitucion_textos_predefinidos'); add_filter('ngettext', 'sustitucion_textos_predefinidos');
🔍 ¿Cómo funciona este código?
$palabrases un array donde la clave es el texto original (en inglés) y el valor es la traducción al español.str_ireplacereemplaza todas las apariciones del texto original por la traducción, sin distinguir mayúsculas/minúsculas.add_filter('gettext', ...)intercepta las cadenas traducibles de WordPress y las pasa por tu función.add_filter('ngettext', ...)hace lo mismo pero para cadenas con plurales.
Ventaja: No necesitas editar archivos del plugin. Todo se hace desde tu tema, así no pierdes cambios al actualizar.
📝 Cómo personalizar este código
Añadir más traducciones
Solo añade más líneas al array $palabras:
'New text to translate' => 'Nuevo texto traducido',
Consejo: El texto original debe coincidir exactamente con el que usa el plugin. Cópialo y pégalo directamente desde la interfaz.
Eliminar traducciones que no necesites
Borra las líneas que no uses. Cuantas menos, más rápido se ejecuta.
Cambiar traducciones existentes
Solo modifica el valor (la parte derecha de =>).
⚠️ Consideraciones importantes
1. Haz backup antes de tocar functions.php
Un error de sintaxis en este archivo puede tumbar todo tu sitio con un error fatal de PHP. Antes de pegar el código:
Haz backup de tu sitio (archivos y base de datos).
Usa un tema hijo para no perder cambios al actualizar el tema.
Prueba en staging si tu hosting lo ofrece.
2. Mejor usa un plugin de snippets
En lugar de editar functions.php directamente, puedes usar Code Snippets o WPCode. Así:
No tocas archivos del tema.
Puedes activar/desactivar el código sin riesgo.
Si algo falla, lo desactivas y listo.
3. Cuidado con las traducciones ambiguas
Palabras como name, items, Date o Status aparecen en muchos sitios. Si las traduces globalmente, podrías estar cambiando textos en otros plugins que sí estaban bien traducidos.
Solución: Si ves efectos secundarios, elimina esas entradas o usa filtros más específicos como gettext_with_context que diferencian por contexto.
4. Este método no traduce JavaScript
Las cadenas que se cargan vía JavaScript (como algunos mensajes dinámicos de YITH) no pasan por gettext. Para esas, necesitas:
Traducir el archivo JS directamente.
Usar un plugin de traducción como Loco Translate para el JS.
✅ Resultado: un panel de afiliados y wishlist 100% en español
Con este código, tu panel de YITH Affiliates Pro y YITH Wishlist Pro se verá completamente en español. Tus clientes y afiliados tendrán una experiencia coherente, sin mezclas de idiomas que confundan.
Y si algún día actualizas el plugin y aparecen nuevas cadenas en inglés, solo tienes que añadirlas al array.
💬 ¿Necesitas ayuda para traducir plugins de WordPress o personalizar tu tienda WooCommerce?
En Piensa para Crear ofrecemos servicios de traducción de plugins, personalización de temas y optimización de tiendas online.
Contáctanos aquí y hablemos.
❓ Preguntas frecuentes
¿Este código funciona para cualquier plugin?
Sí, siempre que las cadenas pasen por los filtros gettext o ngettext de WordPress. La mayoría de plugins lo hacen.
¿Por qué no usar Loco Translate?
Loco Translate es excelente, pero algunos plugins tienen cadenas "atrapadas" en JavaScript o en lugares que Loco no detecta. Este método complementa a Loco.
¿Ralentiza mi sitio?
Muy poco. El array se recorre solo cuando se traduce una cadena. Con 100 entradas, el impacto es insignificante.
¿Cómo encuentro el texto exacto que quiero traducir?
Usa la herramienta de inspección del navegador o busca en los archivos del plugin. Copia y pega el texto exacto en el array.
¿Qué pasa si el plugin actualiza y cambia los textos?
Dejarán de traducirse esas cadenas. Solo añade las nuevas al array.
📚 Recursos relacionados
Cómo usar Code Snippets para añadir código sin romper tu sitio
Hola, amigos de Piensa para Crear. 👋
Si trabajas con WordPress y plugins premium, seguramente te ha pasado: un plugin no tiene traducción al español, o la tiene incompleta, y no hay forma de traducirlo desde el panel de WordPress.
Esto es especialmente común con plugins de YITH (Affiliates, Wishlist, WooCommerce Wishlist) en sus versiones Pro. Traducen algunas cosas, pero dejan otras en inglés, y el resultado es una tienda con textos mezclados que confunde al cliente.
Después de investigar durante mucho tiempo, encontré que la mejor solución es añadir código en el
functions.phpde tu tema para traducir cada palabra o frase que el plugin no traduce.En este post te explico cómo hacerlo con un ejemplo real: YITH Affiliates Pro y YITH Wishlist Pro.
🧠 ¿Por qué los plugins no se traducen solos?
WordPress usa archivos
.poy.mopara las traducciones. Los plugins bien hechos incluyen estos archivos con las traducciones oficiales.Pero hay varios escenarios donde la traducción falla:
El plugin es premium y no incluye traducción al español.
La traducción está incompleta (traducen el frontend pero no el backend).
El plugin se actualiza y las nuevas cadenas no tienen traducción.
Usas un plugin de traducción como Loco Translate, pero algunas cadenas están "atrapadas" en JavaScript y no se pueden traducir así.
En estos casos, la solución más efectiva es interceptar las cadenas con los filtros
gettextyngettextde WordPress y reemplazarlas por las que tú quieras.🛠️ El código: traducir cadenas específicas de cualquier plugin
Este fragmento se coloca en el archivo
functions.phpde tu tema hijo (nunca en el tema padre).function sustitucion_textos_predefinidos($traduccion){ $palabras = array( // YITH Affiliates Pro 'Become an affiliate' => 'Hazte afiliado', 'and share it anywhere' => 'y compártela en cualquier lugar', "You're just one step away from becoming an affiliate!" => '¡Estás a solo un paso de convertirte en afiliad@!', 'From your affiliate dashboard you can view your recent commissions and visits, consult your affiliate stats and ' => 'Desde tu panel de afiliados puedes ver tus comisiones y visitas recientes, consultar tus estadísticas de afiliados y ', 'manage settings' => 'administrar la configuración', 'for your profile' => 'de tu perfil', 'ITEMS PER PAGE' => 'ARTÍCULOS POR PÁGINA', 'Sign out' => 'Cerrar sesión', 'Stats' => 'Estadísticas', 'Affiliate rate' => 'Tasa de afiliado', 'Total Earnings' => 'Ganancias totales', 'Total Paid' => 'Total pagado', 'Total Refunded' => 'Total reembolsado', 'Balance' => 'Saldo', 'Visits' => 'Visitas', 'Conversion rate' => 'Tasa de conversión', 'Dashboard' => 'Panel', 'Payments' => 'Pagos', 'Generate Link' => 'Generar enlace', 'Created at' => 'Creado el', 'Completed at' => 'Completado el', 'Invoice' => 'Factura', 'There are no registered Pagos yet' => 'Aún no hay pagos registrados', 'Your affiliate ID is' => 'Tu ID de afiliado es', 'Your referral URL is' => 'Tu URL de referencia es', 'Enter any URL' => 'Ingresa cualquier URL', 'this site into the form below to' => 'este sitio en el siguiente formulario para', 'your referral' => 'tu referencia', 'to that page' => 'a esa página', 'Now' => 'Ahora', 'Copy' => 'Copiar', 'this referral' => 'esta referencia', 'PAGE URL' => 'URL DE LA PÁGINA', 'REFERRAL URL' => 'URL DE REFERENCIA', 'Generate' => 'Generar', 'Share on' => 'Compartir en', 'Settings' => 'Ajustes', 'Recent Commissions' => 'Comisiones recientes', 'View all' => 'Ver todo', 'Sorry!' => '¡Lo sentimos!', 'Recent Clicks' => 'Clics recientes', 'Status' => 'Estado', 'There are no registered commissions yet' => 'Aún no hay comisiones registradas', 'Commissions' => 'Comisiones', 'Rate' => 'Tasa', 'Amount' => 'Monto', 'Link' => 'Enlace', 'Origin' => 'Origen', 'Date' => 'Fecha', 'Product' => 'Producto', 'From' => 'Desde', 'Filter' => 'Filtrar', 'Hello' => 'Hola', 'Personal info' => 'Información personal', 'PAYMENT EMAIL' => 'CORREO DE PAGO', 'Email address where you want' => 'Dirección de correo donde quieres', 'receive PayPal Pagos for' => 'recibir pagos de PayPal para', 'NOTIFY ON NEW' => 'NOTIFICAR SOBRE NUEVAS', 'Select this option if you want' => 'Selecciona esta opción si quieres', 'be emailed each time a commission' => 'recibir un correo cada vez que una comisión', 'switches to' => 'cambie a', 'pending' => 'pendiente', 'NOTIFY ON COMMISSION PAID' => 'NOTIFICAR SOBRE COMISIÓN PAGADA', 'be emailed each time a commission is paid' => 'recibir un correo cada vez que se pague una comisión', 'Submit' => 'Enviar', 'is paid' => 'es pagada', 'Changes correctly saved!' => '¡Cambios guardados correctamente!', // YITH Wishlist Pro 'My puntos' => 'Mis puntos', 'Back to all wishlists' => 'Volver a todas las listas de deseos', 'Back to all Lista de deseoss' => 'Volver a todas las listas de deseos', 'APPLY THIS ACTION TO ALL THE SELECTED ITEMS' => 'APLICA ESTA ACCIÓN A TODOS LOS ELEMENTOS SELECCIONADOS', 'name' => 'nombre', 'Unit price' => 'Precio unitario', 'Quantity' => 'Cantidad', 'Stock' => 'Existencias', 'Added on' => 'Añadido el', 'Remove' => 'Eliminar', 'Add to cart' => 'Añadir al carrito', 'Remove to wishlist' => 'Quitar de la lista de deseos', 'Apply' => 'Aplicar', 'Update' => 'Actualizar', 'UpFecha' => 'Actualizar', 'this wishlist' => 'esta lista de deseos', 'Create a wishlist' => 'Crear una lista de deseos', 'Your wishlists' => 'Tus listas de deseos', 'Search wishlist' => 'Buscar lista de deseos', 'Ask for an' => 'Solicitar un', 'Add All To Cart' => 'Añadir todo al carrito', 'Estimate' => 'Presupuesto', 'Privacy' => 'Privacidad', 'Count of items' => 'Número de artículos', 'Created on' => 'Creado el', 'PDF Download' => 'Descargar PDF', 'Delete' => 'Eliminar', 'Public' => 'Pública', 'Shared' => 'Compartida', 'Private' => 'Privada', 'items' => 'artículos', 'Wishlist' => 'Lista de deseos', ); $traduccion = str_ireplace(array_keys($palabras), $palabras, $traduccion); return $traduccion; } add_filter('gettext', 'sustitucion_textos_predefinidos'); add_filter('ngettext', 'sustitucion_textos_predefinidos');
🔍 ¿Cómo funciona este código?
$palabrases un array donde la clave es el texto original (en inglés) y el valor es la traducción al español.str_ireplacereemplaza todas las apariciones del texto original por la traducción, sin distinguir mayúsculas/minúsculas.add_filter('gettext', ...)intercepta las cadenas traducibles de WordPress y las pasa por tu función.add_filter('ngettext', ...)hace lo mismo pero para cadenas con plurales.
Ventaja: No necesitas editar archivos del plugin. Todo se hace desde tu tema, así no pierdes cambios al actualizar.
📝 Cómo personalizar este código
Añadir más traducciones
Solo añade más líneas al array
$palabras:'New text to translate' => 'Nuevo texto traducido',
Consejo: El texto original debe coincidir exactamente con el que usa el plugin. Cópialo y pégalo directamente desde la interfaz.
Eliminar traducciones que no necesites
Borra las líneas que no uses. Cuantas menos, más rápido se ejecuta.
Cambiar traducciones existentes
Solo modifica el valor (la parte derecha de
=>).⚠️ Consideraciones importantes
1. Haz backup antes de tocar
functions.phpUn error de sintaxis en este archivo puede tumbar todo tu sitio con un error fatal de PHP. Antes de pegar el código:
Haz backup de tu sitio (archivos y base de datos).
Usa un tema hijo para no perder cambios al actualizar el tema.
Prueba en staging si tu hosting lo ofrece.
2. Mejor usa un plugin de snippets
En lugar de editar
functions.phpdirectamente, puedes usar Code Snippets o WPCode. Así:No tocas archivos del tema.
Puedes activar/desactivar el código sin riesgo.
Si algo falla, lo desactivas y listo.
3. Cuidado con las traducciones ambiguas
Palabras como
name,items,DateoStatusaparecen en muchos sitios. Si las traduces globalmente, podrías estar cambiando textos en otros plugins que sí estaban bien traducidos.Solución: Si ves efectos secundarios, elimina esas entradas o usa filtros más específicos como
gettext_with_contextque diferencian por contexto.4. Este método no traduce JavaScript
Las cadenas que se cargan vía JavaScript (como algunos mensajes dinámicos de YITH) no pasan por
gettext. Para esas, necesitas:Traducir el archivo JS directamente.
Usar un plugin de traducción como Loco Translate para el JS.
✅ Resultado: un panel de afiliados y wishlist 100% en español
Con este código, tu panel de YITH Affiliates Pro y YITH Wishlist Pro se verá completamente en español. Tus clientes y afiliados tendrán una experiencia coherente, sin mezclas de idiomas que confundan.
Y si algún día actualizas el plugin y aparecen nuevas cadenas en inglés, solo tienes que añadirlas al array.
💬 ¿Necesitas ayuda para traducir plugins de WordPress o personalizar tu tienda WooCommerce?
En Piensa para Crear ofrecemos servicios de traducción de plugins, personalización de temas y optimización de tiendas online.
Contáctanos aquí y hablemos.❓ Preguntas frecuentes
¿Este código funciona para cualquier plugin?
Sí, siempre que las cadenas pasen por los filtrosgettextongettextde WordPress. La mayoría de plugins lo hacen.¿Por qué no usar Loco Translate?
Loco Translate es excelente, pero algunos plugins tienen cadenas "atrapadas" en JavaScript o en lugares que Loco no detecta. Este método complementa a Loco.¿Ralentiza mi sitio?
Muy poco. El array se recorre solo cuando se traduce una cadena. Con 100 entradas, el impacto es insignificante.¿Cómo encuentro el texto exacto que quiero traducir?
Usa la herramienta de inspección del navegador o busca en los archivos del plugin. Copia y pega el texto exacto en el array.¿Qué pasa si el plugin actualiza y cambia los textos?
Dejarán de traducirse esas cadenas. Solo añade las nuevas al array.📚 Recursos relacionados

Comentarios
Publicar un comentario