Si eres desarrollador de plugins para WordPress, seguramente habrás notado que en la versión 6.7 las traducciones no se cargan correctamente con la función load_plugin_textdomain()
. Este problema se debe a los cambios en la forma en que WordPress maneja las traducciones. A partir de la versión 6.7, WordPress pone un mayor énfasis en la carga de las traducciones desde la carpeta central wp-content/languages/themes/
, lo que puede generar inconvenientes para los plugins que utilizan el enfoque tradicional.
¿Cómo solucionarlo?
A continuación, te muestro una solución que permite que las traducciones de tu plugin se copien automáticamente a la ubicación correcta dentro de wp-content/languages/plugins/
y asegure su disponibilidad sin necesidad de intervención manual.
function zd_load_textdomain() {
// Definir el dominio de texto y las rutas de los archivos de traducción
$text_domain = 'zd';
$plugin_lang_dir = plugin_dir_path( __FILE__ ) . 'lang/';
$global_lang_dir = WP_CONTENT_DIR . '/languages/plugins/';
// Crear el directorio global de idiomas si no existe
if ( ! file_exists( $global_lang_dir ) ) {
mkdir( $global_lang_dir, 0755, true );
}
// Archivos de traducción .po y .mo
$po_file = $plugin_lang_dir . $text_domain . '-' . get_locale() . '.po';
$mo_file = $plugin_lang_dir . $text_domain . '-' . get_locale() . '.mo';
// Copiar los archivos de traducción a la carpeta global si no están presentes
if ( file_exists( $po_file ) && ! file_exists( $global_lang_dir . $text_domain . '-' . get_locale() . '.mo' ) ) {
copy( $mo_file, $global_lang_dir . $text_domain . '-' . get_locale() . '.mo' );
}
if ( file_exists( $po_file ) && ! file_exists( $global_lang_dir . $text_domain . '-' . get_locale() . '.po' ) ) {
copy( $po_file, $global_lang_dir . $text_domain . '-' . get_locale() . '.po' );
}
}
add_action( 'plugins_loaded', 'zd_load_textdomain' );
Explicación del Hook:
En este ejemplo, la función zd_load_textdomain()
se engancha al hook plugins_loaded
de WordPress. Este hook se ejecuta después de que todos los plugins hayan sido cargados, lo que nos permite asegurar que las traducciones del plugin estén disponibles en el momento adecuado.
- Función
zd_load_textdomain()
:- Esta función verifica si los archivos
.po
y.mo
de traducción existen en la carpeta del plugin. Si estos archivos están presentes, se copian al directorio globalwp-content/languages/plugins/
. - ¿Por qué hacer esto? Esto garantiza que las traducciones se carguen correctamente en la ubicación predeterminada de WordPress, especialmente después de los cambios en la versión 6.7 que priorizan la carga de traducciones desde la carpeta de temas.
- Esta función verifica si los archivos
El $text_domain
en WordPress es un identificador único utilizado para cargar las traducciones de un tema o plugin. Este valor se usa en funciones como load_plugin_textdomain()
para asociar las cadenas de texto con los archivos de traducción correspondientes (por ejemplo, mi_plugin-es_ES.mo
). Para personalizarlo, basta con definir un valor único para $text_domain
en el código y asegurarse de que los archivos de traducción (por ejemplo, mi_plugin-es_ES.po
y mi_plugin-es_ES.mo
) estén nombrados y ubicados correctamente en el directorio de idiomas del plugin (/languages/plugins/
).
Con esta solución, no solo solucionas el problema de la carga de traducciones, sino que también automatizas el proceso de copiado, evitando que el desarrollador tenga que preocuparse por mover los archivos manualmente.