_load_textdomain_just_in_time was called incorrectly est une notice PHP générée par WordPress 6.7 (novembre 2024) lorsqu’un plugin ou un thème tente de charger ses fichiers de traduction avant que WordPress ait fini d’initialiser ses fonctions d’internationalisation. Ce n’est pas une erreur fatale : votre site continue de fonctionner. Mais elle pollue les logs, peut faire remonter un écran blanc si WP_DEBUG est actif, et indique un problème de compatibilité à corriger. La solution rapide : identifier l’extension fautive dans le message d’erreur, mettre à jour le plugin concerné ou déplacer l’appel à load_plugin_textdomain() dans un hook init.

Qu’est-ce que l’erreur _load_textdomain_just_in_time was called incorrectly ?

WordPress utilise une fonction interne, _load_textdomain_just_in_time(), pour charger les traductions d’un plugin ou d’un thème au moment où une chaîne est demandée pour la première fois via __(), _e() ou _x(). Ce mécanisme de chargement paresseux (lazy loading) a été introduit progressivement depuis WordPress 6.1 et est devenu plus strict en WordPress 6.7.

Avant la version 6.7, WordPress tolérait que les plugins appellent load_plugin_textdomain() très tôt dans leur cycle de vie, parfois directement à la racine du fichier principal, en dehors de tout hook. Depuis 6.7, cette pratique déclenche un appel à _doing_it_wrong(), qui génère la notice suivante dans les logs ou à l’écran :

Notice: Function _load_textdomain_just_in_time was called incorrectly.
Translation loading for the {nom-du-plugin} domain was triggered too early.
This is usually an indicator for some code in the plugin or theme running too early.
Translations should be loaded at the init action or later.
Please see Debugging in WordPress for more information.
(This message was added in version 6.7.0.)

Le message indique clairement quel domaine de traduction est en cause ({nom-du-plugin}) et depuis quelle version le comportement est appliqué. Cette information est votre point de départ pour le diagnostic.

Pourquoi WordPress 6.7 a-t-il introduit ce changement ?

La raison principale est la performance. Avant le lazy loading, WordPress chargeait en mémoire les fichiers .mo de tous les plugins actifs au démarrage, même si aucune chaîne traduite n’était utilisée par une requête donnée. Un site avec 20 plugins actifs chargeait potentiellement 20 fichiers de traduction inutilement.

Depuis WordPress 6.1, le moteur charge les traductions à la demande. Mais pour que ce système fonctionne correctement, les plugins ne doivent pas forcer le chargement des traductions avant que WordPress soit prêt. L’équipe Core a mesuré une réduction de 30 à 40 % de la consommation mémoire sur des sites multilingues grâce à ce changement, selon les données publiées dans le billet de l’équipe Make WordPress Core d’octobre 2024.

Le changement de la version 6.7 ajoute une couche de détection pour identifier les plugins qui contournent le mécanisme lazy loading en chargeant leurs traductions trop tôt. Ce n’est pas un blocage, mais un signal envoyé aux développeurs de plugins pour qu’ils mettent leur code à jour.

Identifier le plugin ou le thème responsable

Le message d’erreur contient le domaine de texte du plugin ou du thème fautif. C’est le premier paramètre de load_plugin_textdomain(), généralement le slug du plugin (ex : woocommerce, elementor, contact-form-7).

Pour voir le message complet avec la trace PHP, activez le débogage dans wp-config.php :

// wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);   // log dans wp-content/debug.log
define('WP_DEBUG_DISPLAY', false); // ne pas afficher en frontend

Consultez ensuite le fichier wp-content/debug.log (via FTP ou le gestionnaire de fichiers cPanel). Vous verrez une entrée de ce type :

[14-Jul-2026 09:12:33 UTC] PHP Notice: Function _load_textdomain_just_in_time was called incorrectly.
Translation loading for the my-plugin domain was triggered too early.
...

Le domaine my-plugin correspond en général au slug du plugin dans wp-content/plugins/. Si plusieurs plugins déclenchent la notice, le log contiendra plusieurs entrées distinctes.

Méthode alternative via WP-CLI :

# Lister les plugins actifs et leur domaine de texte
wp plugin list --fields=name,status,version --status=active

# Forcer l'affichage des notices dans la CLI
wp --debug shell

Corriger l’erreur dans votre propre plugin ou thème

Si vous êtes développeur et que c’est votre propre code qui déclenche la notice, la correction est simple : déplacer l’appel de load_plugin_textdomain() dans un hook init.

Code incorrect (avant WordPress 6.7) :

<?php
// Mauvaise pratique : appel direct a la racine du fichier
load_plugin_textdomain('mon-plugin', false, dirname(plugin_basename(__FILE__)) . '/languages/');

add_action('init', 'mon_plugin_init');
function mon_plugin_init() {
    // logique du plugin
}

Code correct (compatible WordPress 6.7+) :

<?php
// Bonne pratique : charger les traductions dans le hook init
add_action('init', 'mon_plugin_load_textdomain');
function mon_plugin_load_textdomain() {
    load_plugin_textdomain(
        'mon-plugin',
        false,
        dirname(plugin_basename(__FILE__)) . '/languages/'
    );
}

add_action('init', 'mon_plugin_init', 20);
function mon_plugin_init() {
    // logique du plugin (priorite 20, apres le chargement des traductions)
}

Pour un thème, la pratique recommandée est d’utiliser le hook after_setup_theme :

<?php
// Dans functions.php du theme
add_action('after_setup_theme', 'mon_theme_setup');
function mon_theme_setup() {
    load_theme_textdomain('mon-theme', get_template_directory() . '/languages');
    // autres reglages du theme
}

Note importante : depuis WordPress 6.7, les traductions des plugins sont automatiquement chargées depuis le répertoire wp-content/languages/plugins/ si aucun appel explicite à load_plugin_textdomain() n’est effectué. Dans de nombreux cas, vous pouvez donc supprimer complètement l’appel et laisser WordPress gérer le chargement de façon native.

Corriger sans toucher au code (plugins tiers)

Si la notice vient d’un plugin tiers que vous ne développez pas, vous avez plusieurs options.

Option 1 : mettre à jour le plugin. La majorité des plugins populaires ont déjà publié une mise à jour compatible WordPress 6.7. Allez dans Tableau de bord, puis Extensions, puis Mises à jour disponibles. Appliquez la mise à jour du plugin concerné. Vérifiez ensuite les logs.

Option 2 : désactiver temporairement la notice via un filtre. Cette approche masque la notice sans corriger la cause. Elle est acceptable en production pour éviter de polluer les logs pendant qu’une mise à jour du plugin est attendue :

<?php
// Dans wp-content/mu-plugins/disable-textdomain-notice.php
// Masque uniquement la notice _load_textdomain_just_in_time
add_filter('doing_it_wrong_trigger_error', function($trigger, $function_name) {
    if ($function_name === '_load_textdomain_just_in_time') {
        return false;
    }
    return $trigger;
}, 10, 2);

Placez ce fichier dans le répertoire wp-content/mu-plugins/ (créez le répertoire s’il n’existe pas). Les mu-plugins (must-use plugins) se chargent automatiquement sans activation.

Option 3 : désactiver les notices PHP globalement. Moins précis, mais efficace si vous ne voulez aucune notice en production. Dans wp-config.php :

// Desactive toutes les notices PHP (pas seulement textdomain)
@ini_set('display_errors', 0);
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);

Si l’erreur provient de WooCommerce, notez que la version 9.4.0 (sortie novembre 2024) inclut le correctif. Mettez à jour WooCommerce si vous êtes en version antérieure.

Cas particuliers : erreur dans wp-admin uniquement

Certains plugins chargent leurs traductions différemment selon le contexte (frontend ou administration). Si la notice apparaît uniquement dans wp-admin mais pas en frontend, cherchez dans le code du plugin un appel conditionnel :

<?php
// Exemple de code problematique en contexte admin
if (is_admin()) {
    // Cet appel se fait avant init en contexte admin
    load_plugin_textdomain('mon-plugin', false, '/languages/');
}

La solution est identique : déplacer cet appel dans un hook. En contexte admin, vous pouvez utiliser admin_init :

<?php
add_action('admin_init', 'mon_plugin_load_admin_textdomain');
function mon_plugin_load_admin_textdomain() {
    load_plugin_textdomain('mon-plugin', false, '/languages/');
}

Si la notice apparaît lors de l’activation d’un plugin (via le hook register_activation_hook), c’est que le fichier principal du plugin contient un appel hors hook. Vérifiez les premières lignes du fichier principal après les en-têtes du plugin.

Vérifier que la correction est appliquée

Après avoir mis à jour le plugin ou modifié le code, procédez à une vérification en trois étapes :

  1. Videz le cache de votre site (LiteSpeed, WP Rocket, ou via WP-CLI sans plugin) pour s’assurer que WordPress recharge les fichiers PHP.
  2. Consultez le fichier debug.log une à deux minutes après une navigation sur le site. Si la notice n’apparaît plus, la correction est effective.
  3. Désactivez WP_DEBUG une fois la vérification terminée pour ne pas exposer les messages d’erreur en production.

Si le problème persiste après mise à jour, vérifiez qu’il n’y a pas un conflit avec un autre plugin. Désactivez les plugins un par un (méthode classique de débogage) pour isoler le fautif, comme vous le feriez pour une erreur 500 WordPress.

Pour aller plus loin, utilisez l’outil Query Monitor (plugin gratuit) : il affiche dans la barre d’administration WordPress la liste complète des hooks déclenchés et des notices PHP, avec leur provenance exacte (fichier et ligne), ce qui rend l’identification du plugin fautif quasi immédiate.

Sources

Questions fréquentes

_load_textdomain_just_in_time was called incorrectly est-elle une erreur critique ?

Non, ce n’est pas une erreur critique. Il s’agit d’une notice PHP qui n’interrompt pas le fonctionnement de votre site. Elle est visible uniquement si WP_DEBUG est activé ou dans votre fichier debug.log. En production avec WP_DEBUG désactivé, elle n’apparaît pas à vos visiteurs.

Quel plugin est responsable de cette notice ?

Le message d’erreur contient le nom du domaine de texte du plugin fautif, par exemple : « Translation loading for the my-plugin domain was triggered too early. » Ce nom correspond généralement au slug du plugin dans wp-content/plugins/. Activez WP_DEBUG_LOG pour voir le message complet si il n’est pas affiché à l’écran.

Comment corriger cette erreur dans WooCommerce ?

Si la notice vient de WooCommerce, mettez à jour vers la version 9.4.0 ou supérieure, qui intègre le correctif officiel. Allez dans Tableau de bord, puis Extensions, puis Mises à jour disponibles et appliquez la mise à jour. Si vous utilisez une version personnalisée ou un plugin WooCommerce tiers, signalez le problème à l’auteur du plugin.

Est-ce que WordPress 6.7 a cassé des plugins avec ce changement ?

Le comportement de WordPress 6.7 n’a pas cassé de plugins : les traductions continuent de se charger correctement. La notice est un avertissement pour les développeurs, pas un blocage. Les plugins qui affichaient des traductions avant WordPress 6.7 continuent de fonctionner de la même façon. Seul l’ordre interne de chargement est vérifié et signalé.

Peut-on désactiver cette notice de façon permanente ?

Oui, en utilisant le filtre doing_it_wrong_trigger_error dans un mu-plugin (voir la section corriger sans toucher au code ci-dessus). Cette solution est valide en production quand vous attendez qu’un auteur de plugin publie la mise à jour corrective. Sur le long terme, il est préférable de résoudre la cause racine en mettant à jour le plugin concerné.

G
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.