Подавление уведомлений об устаревших функциях

16 сент. 2016 г., 13:22:39
Просмотры: 21.4K
Голосов: 15

Когда я использую:

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 в строке 369

Strict 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

4
Комментарии

в каком файле появляется первое уведомление?

mmm mmm
16 сент. 2016 г. 13:31:48

Можете ли вы показать уведомление об устаревании, которое вы получаете? Это поможет мне дать более точный ответ

Ethan Rævan Ethan Rævan
16 сент. 2016 г. 17:04:56

Смотрите выше, добавлено в оригинальный пост

Chris Pink Chris Pink
18 сент. 2016 г. 12:55:55

@ChrisPink По моему опыту работы со старыми установками WordPress, я бы поместил код, который я предоставил в своем ответе, в оба файла: ot-loader.php и dropdown-menus.php.

Ethan Rævan Ethan Rævan
18 сент. 2016 г. 17:37:23
Все ответы на вопрос 6
2
17

Мне удалось подавить уведомления в логах и отображаемые ошибки с помощью функции error_reporting в must-use плагине, который загружается достаточно рано, чтобы перехватить большинство предупреждений кода ядра WordPress. Это полезно для предупреждений из файлов ядра/плагинов, которые не следует изменять.

Я создал php-файл в папке /wp-content/mu-plugins/ с таким кодом:

<?php 
error_reporting(E_ALL & ~E_WARNING & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);
?>
11 нояб. 2021 г. 21:01:12
Комментарии

Спасибо, это сработало для меня!

Azamat Azamat
10 февр. 2022 г. 01:21:28

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

volkerschulz volkerschulz
30 окт. 2023 г. 11:16:45
4

Как mmm указал:

в каком файле появляется первое уведомление?

Где бы уведомление ни упоминало местоположение этой устаревшей функции (path/to/some/file.php), вы должны вставить следующее сразу после тега <?php, который начинается в файле:

error_reporting(0);

Я пробовал вышеупомянутые функции, которые вы упомянули, и вставлял их в свой wp-config.php, когда сталкивался с чем-то подобным, но они не сработали для меня. Это отключит предупреждения, устаревшие функции и всё остальное, кроме ошибок.

16 сент. 2016 г. 17:14:58
Комментарии

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

Chris Pink Chris Pink
18 сент. 2016 г. 13:04:25

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

Ethan Rævan Ethan Rævan
18 сент. 2016 г. 17:33:38

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

Chris Pink Chris Pink
20 сент. 2016 г. 10:35:32

@ChrisPink Да, вставьте этот код в ot-loader.php.

Ethan Rævan Ethan Rævan
20 сент. 2016 г. 20:50:50
2

Это, вероятно, самый "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;
            },
        ),
    ),
));
27 янв. 2023 г. 18:26:28
Комментарии

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

Rup Rup
3 февр. 2023 г. 14:46:28

Это вызвало у меня ошибку "Фатальная ошибка: Вызов undefined функции wp_is_json_request() в /var/www/html/wp-config.php на строке 111", закомментирование этой части проверки сработало (заметьте, что это в старом WordPress-установке)

Ferrybig Ferrybig
24 мар. 2023 г. 10:27:43
0

похоже, многие плагины также изменяют это значение, поэтому мне хорошо помогли эти два подхода:

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

// даже позже, но не слишком поздно
add_action('wp', function() { error_reporting( E_ALL & ~E_NOTICE ); 
});
20 окт. 2023 г. 19:05:15
1

Следующий код позволяет удалить устаревшие (deprecated) ошибки из текущих настроек отчетов об ошибках. Добавление этого кода в файл functions.php вашей темы скроет все устаревшие ошибки.

error_reporting(error_reporting() & ~E_DEPRECATED);
30 нояб. 2023 г. 14:10:39
Комментарии

Спасибо! Из всех подходов, предложенных с 2016 года, этот сработал сразу же

Eric Hepperle - CodeSlayer2010 Eric Hepperle - CodeSlayer2010
1 мая 2024 г. 23:05:35
0

Вы можете сделать так, чтобы по-прежнему иметь возможность отладки при необходимости:

Пример (разместите в 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);
        }
    }
});
26 янв. 2025 г. 04:39:11