Сегодня рассмотрим практический кейс по борьбе с надоедливой ошибкой, с которой часто сталкиваются программисты 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()
Если вы уже делали много попыток решить эту проблему, но ничего не помогло, давайте рассмотрим самые эффективные подходы, обычно помогающие снизить уровень оповещения, не выключая полностью логирования.
Первое, что следует проверить:
Это не «выключение логирования», а уменьшение детализации логов к более важным сообщениям (ошибкам и предупреждениям). Уровень ошибок 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 phpinfo(); ?>
error_reporting
в этом файле (как показано выше)display_errors
может иметь значение Off (для продакшна) или On (для отладки на локалке); log_errors = On
(включаем логирование), путь в строке error_log
будет указывать на путь к файлу логов, например error_log = "c:/wamp64/logs/php_error.log"
phpinfo()
снова:phpinfo()
в браузере.error_reporting
теперь отображается как 32759
(это числовое значение E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
).display_errors
отображается как Off.php_error.log
и/или wp-content/debug.log
), исчезли ли эти 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
сохраните файл и перезагрузите локальный сервер.
.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 и т.д.).
Если предыдущие шаги не помогли, и вы должны избавиться от этого сообщения, можно попытаться обернуть вызов функции _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.
error_reporting()
в wp-config.php
не успевает полностью подавить его до того, как WordPress его «схватит» и запишет в debug.log
. Это означает, что реализация функции _load_textdomain_just_in_time
или ее вызов плагинами действительно генерирует Notice до того, как 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
, то наиболее вероятных шагов на локальном сервере у вас будет несколько:
debug.log
. На живом сайте WP_DEBUG_LOG
должен быть отключен (define('WP_DEBUG_LOG', false);
), поэтому эти сообщения не будут появляться в продакшн логах. Можете периодически очищать debug.log
вручную, чтобы он не разрастался.WP_DEBUG_LOG
(для разработки): Это уберет все сообщения из debug.log
, включая потенциально важные предупреждения об ошибках в вашем собственном коде. Но если эти Notice действительно столь сильно вас беспокоят, это может быть временным компромиссом:define('WP_DEBUG_LOG', false ); // Выставьте на false, чтобы отключить запись логов в debug.log
Помните: Это не исправляет первопричину, а лишь скрывает логирование. Вы теряете ценный инструмент отладки.
Скорее всего, проблему есть реальным решить одним из следующих шагов:
error_reporting
в php.ini
на E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
и перезапуск локального сервераЭти шаги позволят вам продолжать логировать настоящие ошибки и предупреждения, игнорируя при этом некритичные Notices от посторонних плагинов. Моя рекомендация – сосредоточиться на том, влияет ли эта ошибка Notice на функциональность вашего сайта. Если нет, то на локальном сервере ее можно игнорировать или периодически чистить лог. Для продакшн-сайта желательно всегда отключать WP_DEBUG_LOG
.
Попробуйте указанные в сегодняшнем практическом кейсе решения, и проблему можно победить!
Если есть достойная цель, то она упрощает наше существование Харуки Мураками
В современном мире, где стабильность электроснабжения является ключевым фактором комфорта и бесперебойной работы, наличие надежного…
Даже если вы очень талантливы и прилагаете большие усилия, для некоторых результатов просто нужно время:…
Этот практический урок поможет вам перенести данные из вашего Excel-файла (с некоторыми конкретными столбцами) в…
Пиво – один из самых популярных напитков, который наряду с чаем и кофе известен во…
Довольно часто у программистов возникает соблазн написать какую-нибудь обширную функцию, которая должна решать определенную задачу.…