Skip to content

WordPress 6.7以降で発生する_load_textdomain_just_in_time警告の解決方法

問題の説明

WordPress 6.7にアップデート後、次のようなPHP警告が表示される場合があります:

php
Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the blahblah 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.) in /wp-includes/functions.php on line 6114

この警告は次のことを示しています:

  • 翻訳関数(__()_e()など)が初期化が完了する前に呼び出されている
  • テーマやプラグインのコードが適切なタイミングで実行されていない
  • WordPress 6.7で導入された新しい翻訳システムの挙動変更が原因

解決策:ウェブサイト所有者向け

1. テーマとプラグインの更新

既知の問題の多くは開発者によって修正されています:

  1. 管理画面 → [更新]にアクセス
  2. 利用可能な更新をすべて適用
  3. 問題が解決するか確認

2. 問題のあるテーマ/プラグインの特定

エラーメッセージの以下の部分に注目:

Translation loading for the **[textdomain]** domain...

[textdomain]の部分が問題を起こしているテーマ/プラグインの識別子になります。

3. 問題の報告

エラーが続く場合はtextdomainを確認し、該当するテーマやプラグインの開発者へ報告してください。


解決策:開発者向け

1. 正しいフックを使ったテキストドメインの登録

翻訳の読み込みはinitアクション以降で行う必要があります:

間違った実装例(plugins_loadedフック)

php
add_action('plugins_loaded', function() {
    load_plugin_textdomain('your-textdomain', false, '/path/to/languages/');
});

修正後の正しい実装例(initフック)

php
add_action('init', function() {
    load_plugin_textdomain('your-textdomain', false, '/path/to/languages/');
});

2. 早期実行が避けられない場合のコード修正

initアクション前に翻訳が必要な場合の代替案:

php
// 翻訳関数を直接含めるのではなく...
$text = __('All rights reserved.', 'textdomain');

// プレーンテキストで初期化+後で翻訳
$text = 'All rights reserved.';

// 表示時に翻訳
echo __('All rights reserved.', 'textdomain');

3. get_plugin_data関数の代替手段

initアクション前にget_plugin_dataを使用するとエラーが発生します:

php
// 代わりにget_file_dataを使用する
$plugin_data = get_file_data(
    ABSPATH . 'wp-content/plugins/your-plugin/main-file.php',
    ['Version' => 'Version'],
    false
);

問題箇所の特定方法(詳細デバッグ)

重要

この方法は開発環境でのみ実施し、修正後は元に戻してください。

  1. wp-includes/l10n.phpを開く
  2. _load_textdomain_just_in_time関数を検索(通常1300行目付近)
  3. 関数内の先頭付近に以下を追加:
php
if ($domain == "YOUR_TEXTDOMAIN") {
    ob_start();
    debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
    $trace = ob_get_clean();
    
    $log_message = "EARLY TRANSLATION CALL FOR: " . $domain . "\n";
    $log_message .= "STACK TRACE:\n" . $trace . "\n";
    $log_message .= "----------------------------------\n";
    
    error_log($log_message);
}
  1. ページをリロードすると、エラーの原因となったファイルと行数がPHPエラーログに出力されます

よくある原因と追加の対処法

  1. カスタマイザー内の翻訳関数

    php
    // カスタマイザー設定での誤り
    'footer_text' => __('All rights reserved.', 'textdomain'),
    
    // 修正案(生テキストで一時対応)
    'footer_text' => 'All rights reserved.',
  2. after_setup_themeフックの優先度問題

    php
    // 低すぎる優先度が原因の場合
    add_action('after_setup_theme', 'setup_theme', 5);
    
    // 優先度を下げてinit後に実行
    add_action('after_setup_theme', 'setup_theme', 20);
  3. 依存プラグインの問題

    • 主要プラグイン(WooCommerce等)では独自の修正版が提供されている場合あり
    • 公式ドキュメントで最新情報を確認

参考情報