Vi è mai capitato di non riuscire a tradurre una stringa di un plugin Wordpress perchè la funzione _e() si trova all'interno di una funzione php non accessibile tramite un hook?
Sto sperimentando una soluzione molto efficace!
Ecco una classe per gestire le traduzioni dei plugin redirezionandole sul file .po del Vostro tema.
<?php
/**
* Classe per reindirizzare le traduzioni WooCommerce al dominio del tema (myTheme).
*/
class MyTheme_Translations {
/**
* Dominio del tema da cui prendere le traduzioni.
*/
private const THEME_DOMAIN = 'myTheme';
/**
* Domini di WooCommerce da intercettare.
*/
private const WC_DOMAINS = [
'woocommerce',
'woocommerce-admin',
'woocommerce-payments',
];
/**
* Inizializza i filtri.
*/
public static function init(): void {
add_filter('gettext', [__CLASS__, 'gettext'], 10, 3);
add_filter('gettext_with_context', [__CLASS__, 'gettext_with_context'], 10, 4);
add_filter('ngettext', [__CLASS__, 'ngettext'], 10, 5);
add_filter('ngettext_with_context', [__CLASS__, 'ngettext_with_context'], 10, 6);
}
public static function gettext($translated, $text, $domain) {
if (!in_array($domain, self::WC_DOMAINS, true)) {
return $translated;
}
$alt = translate($text, self::THEME_DOMAIN);
return ($alt !== $text) ? $alt : $translated;
}
public static function gettext_with_context($translated, $text, $context, $domain) {
if (!in_array($domain, self::WC_DOMAINS, true)) {
return $translated;
}
$alt = translate_with_gettext_context($text, $context, self::THEME_DOMAIN);
return ($alt !== $text) ? $alt : $translated;
}
public static function ngettext($translated, $single, $plural, $number, $domain) {
if (!in_array($domain, self::WC_DOMAINS, true)) {
return $translated;
}
$alt = translate_nooped_plural([$single, $plural], $number, self::THEME_DOMAIN);
return ($alt !== $single && $alt !== $plural) ? $alt : $translated;
}
public static function ngettext_with_context($translated, $single, $plural, $number, $context, $domain) {
if (!in_array($domain, self::WC_DOMAINS, true)) {
return $translated;
}
// _nx() gestisce plural + context.
$alt = _nx($single, $plural, $number, $context, self::THEME_DOMAIN);
return ($alt !== $single && $alt !== $plural) ? $alt : $translated;
}
}
// Avvia la classe
MyTheme_Translations::init();
Cos'è e a cosa serve
La classe MyTheme_Translations reindirizza le traduzioni di WooCommerce al text domain del tema (myTheme). In pratica, se nel tuo tema hai file di traduzione (.po/.mo) con stringhe alternative, la classe fa in modo che WooCommerce usi quelle al posto delle sue predefinite—senza toccare i file di WooCommerce.
Come funziona
Aggancia i filtri di WordPress per la localizzazione: gettext, gettext_with_context, ngettext, ngettext_with_context.
Intercetta solo i domini: woocommerce, woocommerce-admin, woocommerce-payments (puoi configurarli in WC_DOMAINS).
Per ogni stringa intercettata:
- prova a ritradurla usando il dominio del tema (myTheme);
- se trova un’alternativa diversa, la restituisce;
- altrimenti lascia la traduzione originale di WooCommerce (fallback sicuro).
- Gestisce correttamente contesto e plurali (es. _nx()).
Perché è utile
In questo modo centralizzi gli override delle stringhe di WooCommerce (o di qualsiasi altro plugin) nel tuo tema (o child-theme), eviti di modificare o “forkare” i file di traduzione di WooCommerce e mantieni la compatibilità con aggiornamenti e supporti plurali/contesti perchè non sei costretto modificare il codice del plugin.
La costante WC_DOMAINS Non tocca stringhe di altri plugin/temi fuori dai domini elencati, naturalmente potete rinominarla come preferite e aggiungere i valori che volete.
Non cambia nulla se nel tema manca la traduzione alternativa.
Requisito fondamentale!
Il tema deve caricare il proprio text domain (es. load_theme_textdomain('myTheme', get_template_directory() . '/languages');).
Le stringhe da sovrascrivere devono essere presenti nei file /languages/myTheme-XX_YY.mo del tema.
Come usarla
Includi la classe (ad es. nel functions.php o in un piccolo plugin) e chiama MyTheme_Translations::init();.
Se usi un text domain reale diverso da myTheme, aggiorna la costante THEME_DOMAIN.
Un piccolo consiglio
Se hai problemi di performance con il tuo sito e cerchi un servizio di hosting che supporta sistemi di cache lato infrastruttura come Redis, Memcached o Varnish, ti consiglio questo servizio di hosting:
![]() |