Надоедливая ошибка _load_textdomain_just_in_time в WordPress
Сегодня рассмотрим практический кейс по борьбе с надоедливой ошибкой, с которой часто сталкиваются программисты WordPress при разработке на локальном сервере.
{PHP Notice: Function _load_textdomain_just_in_time was called incorrectly ...}
Почему надоедливой? Потому что ее трудно победить и почти невозможно отключить сообщения о ней. При каждой загрузке страницы (включая AJAX запросы) – в ваш файл логов будет записываться множество уведомлений об этой ошибке _doing_it_wrong().
Входящие данные: при разработке на локальном сервере (Wampserever 3.3.5, PHP 8.3.6, CMS WordPress 6.8.1) в логах постоянно вылетает данная ошибка. Рекомендации по Интернету не помогают, помогает только полное отключение логирования, но, как вы понимаете, – при локальной разработке это вообще не вариант.
Попробуем выключить уведомление о ней в логах. Способы исправления функций и/или плагинов WordPress, которые не будут вызывать данную ошибку – будут рассмотрены в будущих статьях. Сегодня только поговорим об уведомлениях в файлах логирования.
Что означает ошибка _load_textdomain_just_in_time?
Эта PHP ошибка уровня Notice связана с системой интернационализации (i18n) WordPress, отвечающей за перевод сайта на разные языки. Функция _load_textdomain_just_in_time является внутренней функцией WordPress, предназначенной для оптимизации загрузки переводов.
Сообщение Function was called incorrectly означает, что WordPress ожидал, что эта функция будет вызвана в определенный момент жизненного цикла запроса, но какой-то плагин или код делает это раньше или позже, чем предполагалось. Это может быть связано с тем, что плагин пытается загрузить текстовый домен (файлы перевода) еще до того, как WordPress полностью готов к этому.
Хотя это Notice (сообщение, а не критическая ошибка), оно засоряет логи и может маскировать реальные проблемы, а также указывать на потенциально неэффективный код.
Возможные решения отключения показа этого уведомления _doing_it_wrong()
Если вы уже делали много попыток решить эту проблему, но ничего не помогло, давайте рассмотрим самые эффективные подходы, обычно помогающие снизить уровень оповещения, не выключая полностью логирования.
Решение 1: Проверка и обновление версий
Первое, что следует проверить:
- WordPress: Убедитесь, что у вас установлена новейшая версия WordPress (сейчас 6.8.1).
- Плагины: Обязательно обновите плагины до последней доступной версии. Разработчики обычно выпускают обновления, которые исправляют подобные предупреждения, особенно с появлением новых версий PHP.
- Попробуйте другие (низшие) версии PHP
Решение 2: Изменение уровня логирования PHP (на локальном сервере)
Это не «выключение логирования», а уменьшение детализации логов к более важным сообщениям (ошибкам и предупреждениям). Уровень ошибок E_NOTICE продакшн-сайты часто отключают, поскольку они не являются критическими.
В файле php.ini (если у вас WampServer: ссылку на нужный файл можно найти через иконку WampServer -> PHP -> php.ini), найдите строку error_reporting и установите его на:
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
Объяснение кода:
E_ALL: Логировать все типы ошибок.~E_NOTICE: Выключить сообщения (Notices).~E_DEPRECATED: Исключить предупреждения об устаревшем коде.~E_STRICT: Исключить рекомендации по кодированию.
После изменения php.ini обязательно перезапустите все сервисы локального сервера (например, для WampServer через иконку WampServer -> Restart all services).
Это самое распространенное и безопасное решение для разработки, поскольку оно позволяет видеть критические ошибки и предупреждения, но игнорирует «шумные» Notices, часто генерируемые плагинами.
Правильное редактирование файла php.ini
Вам нужно убедиться, что вы редактируете именно тот нужный файл php.ini Вот как убедиться и найти необходимый файл:
- Создайте PHP файл с кодом простой, но мощной функцией для получения информации о текущем состоянии PHP:
<?php phpinfo(); ?>
- Откройте этот файл в браузере и посмотрите на путь в строке «Loaded Configuration File»: это именно тот файл настроек, который нужен.
- Откройте этот файл с помощью текстового редактора (например, Notepad++, VS Code, Sublime Text и т.д.).
- Отредактируйте настройки
error_reportingв этом файле (как показано выше) - Проверьте другие настройки:
display_errorsможет иметь значение Off (для продакшна) или On (для отладки на локалке);log_errors = On(включаем логирование), путь в строкеerror_logбудет указывать на путь к файлу логов, напримерerror_log = "c:/wamp64/logs/php_error.log" - После изменений и перезагрузки сервера, проверьте
phpinfo()снова: - Откройте PHP файл с функцией
phpinfo()в браузере. - Убедитесь, что значение
error_reportingтеперь отображается как32759(это числовое значениеE_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT). - Убедитесь, что
display_errorsотображается как Off.
- Проверьте работу сайта:
- Откройте свой сайт на WordPress.
- Проверьте лог файлы PHP (
php_error.logи/илиwp-content/debug.log), исчезли ли эти Notice сообщения.
Решение 3: Запретить WordPress логировать Notice
Это самый простой способ остановить логирование Notice в debug.log, если другие методы не работают. Вы можете модифицировать файл wp-config.php так, чтобы WordPress игнорировал E_NOTICE при логировании.
В общем, для логирования в WP используются следующие конструкции:
define( 'WP_DEBUG', true ); // включить дебаг
define( 'WP_DEBUG_LOG', true ); // это должно быть true, чтобы лог работал и логирование происходило в файл
// если включено, он будет находиться в wp-content/debug.log define( 'WP_DEBUG_DISPLAY', false ); // это нормально для разработки, чтобы ошибки не выводились на экран, но шли в лог
Мы можем попытаться немного расширить этот дефолтный функционал:
<?php
// Поместите эти строки как можно раньше в wp-config.php, желательно сразу после `<?php`
// и ПЕРЕД `define('WP_DEBUG', true);` или любым `require_once`.
// Отключаем E_NOTICE для внутреннего логирования WordPress
// Этот фильтр будет использоваться до того, как WordPress начнет регистрировать свои ошибки.
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_reporting( E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT );
// Эти ini_set также могут помочь, но error_reporting() является главным
@ini_set( 'log_errors', 'On' );
@ini_set( 'display_errors', 'Off' ); // Важно для разработки, чтобы не выводить на экран
} else {
// Для продакшн среды
error_reporting( 0 ); // Не показывать ошибки
@ini_set( 'display_errors', 'Off' );
@ini_set( 'log_errors', 'Off' );
}
// ... остальной код в файле wp-config.php
Пояснение по коду:
Мы переносим установку error_reporting и ini_set максимально высоко в файле wp-config.php, перед большинством других определений. Таким образом эти настройки применяются раньше, чем WordPress начинает регистрировать свои собственные обработчики ошибок, которые могут игнорировать системные настройки.
Указанные строки в wp-config.php переопределяют настройки из php.ini. Это может быть причиной, почему изменения в php.ini могут не иметь нужного эффекта.
Рекомендация: чтобы настройки в php.ini имели больший приоритет, закомментируйте или удалите любые строки @ini_set() в wp-config.php, касающихся error_reporting или display_errors.
После изменения wp-config.php сохраните файл и перезагрузите локальный сервер.
Решение 4: Использование .htaccess для локального изменения error_reporting
Если php.ini и wp-config.php не дают результата, можно попытаться установить уровень error_reporting через .htaccess. Этот метод влияет только на каталог, где размещены .htaccess и его подкаталоги.
Откройте файл .htaccess в корне своего WordPress сайта и добавьте следующие строки:
# BEGIN WordPress … # имеющийся код # END WordPress # Настройки PHP php_value error_reporting 32759 php_flag display_errors off php_flag log_errors on
Пояснение по коду:
php_value error_reporting 32759: Число32759является битовой маской дляE_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT. Это эквивалент текстового значения.php_flag display_errors off: Отключить вывод ошибок на экран.php_flag log_errors on: Включить логирование ошибок.
Важно: Этот метод работает только, если у вас сервер Apache и на нем включен mod_php или mod_fcgid.
После изменения .htaccess перезагрузите локальный сервер (например, LAMP, XAMPP, WampServer и т.д.).
Решение 5: Вмешательство в код (как крайнее средство; не рекомендуется)
Если предыдущие шаги не помогли, и вы должны избавиться от этого сообщения, можно попытаться обернуть вызов функции _load_textdomain_just_in_time в try-catch или подавить ошибку @ оператором. Пример: если вы найдете в «конфликтном» плагине строку типа:
_load_textdomain_just_in_time( $domain, $mofile );
смените его на:
@_load_textdomain_just_in_time( $domain, $mofile );
Но! Если вы делаете такую модификацию в файлах плагина, ваши изменения будут потеряны после следующего обновления.
Я не рекомендую этот метод, поскольку он создает «хак», который усложняет поддержку и может привести к неожиданным побочным эффектам в будущем.
Не используйте это на живом сайте.
Почему это плохо?
- Любое обновление плагина перезапишет ваши изменения.
- Это маскирует потенциальную проблему в плагине, а не исправляет ее.
Если все предыдущие шаги не сработали, это указывает на то, что проблема может быть несколько глубже или связана с конкретной конфигурацией локального сервера или взаимодействием версий PHP/WordPress/плагинов. Некоторые плагины (особенно старые или сильно модифицирующие ядро) могут иметь очень агрессивные методы загрузки своих переводов, которые могут игнорировать стандартные настройки PHP, или они могут использовать какие-то низкоуровневые вызовы, генерирующие Notice даже при подавлении на уровне error_reporting. Определенные проблемы с этим возникали при использовании плагинов типа Polylang, AMP (Accelerated Mobile Pages) и т.д.. Если ни один из предыдущих шагов не помог, это может быть специфический баг у плагина в комбинации с версией PHP, который не исправляется обычными настройками. В этом случае, возможно, придется ждать обновлений от разработчиков плагинов или обращаться к их поддержке, предоставив им подробности о версиях PHP, плагинов и WordPress.
Почему это трудно исправить:
- Порядок загрузки: WordPress и его плагины имеют сложный порядок загрузки. Вполне возможно, что плагины генерируют это «сообщение о некорректном вызове функции» настолько рано, что даже
error_reporting()вwp-config.phpне успевает полностью подавить его до того, как WordPress его «схватит» и запишет вdebug.log. Это означает, что реализация функции_load_textdomain_just_in_timeили ее вызов плагинами действительно генерирует Notice до того, как WordPress может его эффективно подавить. - Внутренняя логика WordPress/Плагина: Функция
_load_textdomain_just_in_timeявляется внутренней функцией WordPress, и сообщениеFunction was called incorrectlyгенерируется самим WordPress (черезE_NOTICE, WordPress может специально логировать_doing_it_wrong()сообщения, чтобы сообщить разработчикам о потенциально неправильном использовании своих функций. - Неукротимые
_doing_it_wrong(): Само сообщение о_doing_it_wrong()часто является устойчивым, поскольку оно предназначено для привлечения внимания. Его не всегда можно подавить стандартнымиerror_reportingфлагами, поскольку это не классическийE_NOTICE, а специальный отладочный механизм WordPress.
Что делать дальше (если ничего не помогло):
К сожалению, если вы уже попробовали все стандартные и даже некоторые продвинутые методы конфигурации, и сообщение все равно появляется в debug.log, то наиболее вероятных шагов на локальном сервере у вас будет несколько:
- Смириться с этим (самое простое): Если это только Notice и он не влияет на функциональность сайта, а вы работаете на локальном сервере, то, возможно, самый простой путь – это просто игнорировать эти конкретные сообщения в
debug.log. На живом сайтеWP_DEBUG_LOGдолжен быть отключен (define('WP_DEBUG_LOG', false);), поэтому эти сообщения не будут появляться в продакшн логах. Можете периодически очищатьdebug.logвручную, чтобы он не разрастался. - Связаться с разработчиками плагинов: Поскольку проблема часто идентифицируется как связанная с плагинами, попробуйте связаться с поддержкой разработчиков этих плагинов. Предоставьте им все подробности: версии WordPress, PHP, плагина, локального сервера, а также точное сообщение об ошибке. Они могут знать об этой проблеме и иметь патч или рабочее решение, или включить исправления в будущие обновления.
- Временно отключить
WP_DEBUG_LOG(для разработки): Это уберет все сообщения изdebug.log, включая потенциально важные предупреждения об ошибках в вашем собственном коде. Но если эти Notice действительно столь сильно вас беспокоят, это может быть временным компромиссом:
define('WP_DEBUG_LOG', false ); // Выставьте на false, чтобы отключить запись логов в debug.log
Помните: Это не исправляет первопричину, а лишь скрывает логирование. Вы теряете ценный инструмент отладки.
Вместо вывода
- Обновление WordPress до последней актуальной версии
- Обновление плагинов до последних версий
- Изменение
error_reportingвphp.iniнаE_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICTи перезапуск локального сервера
Эти шаги позволят вам продолжать логировать настоящие ошибки и предупреждения, игнорируя при этом некритичные Notices от посторонних плагинов. Моя рекомендация – сосредоточиться на том, влияет ли эта ошибка Notice на функциональность вашего сайта. Если нет, то на локальном сервере ее можно игнорировать или периодически чистить лог. Для продакшн-сайта желательно всегда отключать WP_DEBUG_LOG.
Попробуйте указанные в сегодняшнем практическом кейсе решения, и проблему можно победить!