Подавление уведомлений об устаревших функциях
Когда я использую:
define('WP_DEBUG', 1);
В моем wp-config.php
, всё работает нормально, но я модифицирую старую тему и хотел бы подавить уведомления о устаревших функциях (deprecated notices).
Я думаю, что добавление следующего кода:
error_reporting( E_ERROR | E_NOTICE | E_PARSE )
Должно решить проблему. Я добавил его в wp-config.php
и в header.php
моей темы. К сожалению, это не дает никакого эффекта. Может быть это настраивается на уровне сервера? Также следующий код тоже не приносит результата:
ini_set('display_errors', 1);
Как было запрошено в комментариях ниже, вот несколько примеров уведомлений. Я использую модифицированную версию темы Construct 2, которая довольно старая, но обновлять её небезопасно. Я пытаюсь убедить клиента позволить мне переписать её, сайт довольно простой, но поскольку клиент не видит никаких проблем и считает, что всё работает, он не хочет тратить деньги.
Deprecated: Присваивание результата new по ссылке считается устаревшим в
/Volumes/Macintosh HD/Sites/MAMP (custodian)/wordpress/wp-content/themes/construct2/option-tree/ot-loader.php
в строке 369Strict Standards: Объявление
DropDown_Nav_Menu::start_lvl()
должно быть совместимо сWalker_Nav_Menu::start_lvl(&$output, $depth = 0, $args = Array)
в/Volumes/Macintosh HD/Sites/MAMP (custodian)/wordpress/wp-content/themes/construct2/dropdown-menus.php
в строке 192
Мне удалось подавить уведомления в логах и отображаемые ошибки с помощью функции error_reporting в must-use плагине, который загружается достаточно рано, чтобы перехватить большинство предупреждений кода ядра WordPress. Это полезно для предупреждений из файлов ядра/плагинов, которые не следует изменять.
Я создал php-файл в папке /wp-content/mu-plugins/ с таким кодом:
<?php
error_reporting(E_ALL & ~E_WARNING & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);
?>

Большое спасибо! Я создал плагин для WordPress, чтобы управлять MU-плагином прямо из админ-панели.

Как mmm указал:
в каком файле появляется первое уведомление?
Где бы уведомление ни упоминало местоположение этой устаревшей функции (path/to/some/file.php
), вы должны вставить следующее сразу после тега <?php
, который начинается в файле:
error_reporting(0);
Я пробовал вышеупомянутые функции, которые вы упомянули, и вставлял их в свой wp-config.php
, когда сталкивался с чем-то подобным, но они не сработали для меня. Это отключит предупреждения, устаревшие функции и всё остальное, кроме ошибок.

Интересно (то есть демонстрирует поверхностность моего понимания), что вставка error_reporting(0);
(или любой другой вариации) в первый из файлов, упомянутых в длинном списке сообщений об ошибках, подавляет все сообщения из последующих разных файлов, но не устаревшее уведомление в этом файле.

@ChrisPink Я не до конца понимаю ваш последний комментарий, не могли бы вы уточнить?

Извините, я не очень хорошо объяснил. Вставка error_reporting(0)
в файл ot-loader.php (как указано в сообщении OP) подавила все последующие уведомления, но не то, которое исходило из ot-loader.php (указанное в OP). Поэтому я предполагаю, что мне нужно вставить функцию error_reporting() в файл, который вызывает ot-loader.php.

Это, вероятно, самый "WordPress-овский" способ сделать это.
Код должен быть помещен в ваш файл wp-config, после определений WP_DEBUG (и любых других), потому что этот конкретный фильтр запускается до загрузки любых плагинов.
$GLOBALS['wp_filter'] = array(
'enable_wp_debug_mode_checks' => array(
10 => array(
array(
'accepted_args' => 0,
'function' => function () {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
// *** Это ключевая строка - измените для настройки желаемого уровня логирования
error_reporting( E_ALL & ~E_DEPRECATED );
ini_set( 'display_errors', defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ? 1 : 0 );
if ( in_array( strtolower( (string) WP_DEBUG_LOG ), array( 'true', '1' ), true ) ) {
$log_path = WP_CONTENT_DIR . '/debug.log';
} elseif ( is_string( WP_DEBUG_LOG ) ) {
$log_path = WP_DEBUG_LOG;
} else {
$log_path = false;
}
if ( $log_path ) {
ini_set( 'log_errors', 1 );
ini_set( 'error_log', $log_path );
}
if (
defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' ) ||
( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) ||
wp_doing_ajax() || wp_is_json_request() ) {
ini_set( 'display_errors', 0 );
}
}
return false;
},
),
),
));

Почему до загрузки любых плагинов? Устаревшие предупреждения идут от темы.

похоже, многие плагины также изменяют это значение, поэтому мне хорошо помогли эти два подхода:
// пытаемся быть последними, кто установит это значение
add_action('wp_loaded', function() { error_reporting( E_ALL & ~E_NOTICE );
});
// даже позже, но не слишком поздно
add_action('wp', function() { error_reporting( E_ALL & ~E_NOTICE );
});

Вы можете сделать так, чтобы по-прежнему иметь возможность отладки при необходимости:
Пример (разместите в functions.php темы):
add_action('wp_loaded', function() {
if(WP_DEBUG==false){
// принудительно отключаем вывод ошибок
error_reporting(0);
}else {
if(WP_DEBUG==true){
// устанавливаем собственные правила
error_reporting(E_ALL & ~E_WARNING & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);
}
}
});
