Подавить уведомления о депрекации

Вопрос или проблема

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

define('WP_DEBUG', 1);

В моем wp-config.php, это работает нормально, но я взламываю старую тему и хотел бы подавить уведомления о устаревших функциях.

Я думаю, что добавление этого:

error_reporting( E_ERROR | E_NOTICE | E_PARSE )

Должно сработать. Я добавил это в wp-config.php и в header.php в моей теме. К сожалению, это не влияет. Может быть, это что-то, установленное на уровне сервера? Также следующее не оказывает никакого воздействия:

ini_set('display_errors', 1);

Как было спрошено в комментариях ниже, вот пара уведомлений. Я использую взломанную версию темы Construct 2, довольно старую теперь, но обновить ее было бы небезопасно. Я пытаюсь убедить клиента позволить мне переписать ее, сайт довольно простой, но так как он не видит никаких проблем, он не хочет тратить деньги.

Устарело: Присваивание возвращаемого значения новой функции по ссылке устарело в /Volumes/Macintosh HD/Sites/MAMP (custodian)/wordpress/wp-content/themes/construct2/option-tree/ot-loader.php на строке 369

Строгие стандарты: Декларация 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 в плагине обязательного использования, который загружается достаточно рано, чтобы поймать большинство предупреждений основного кода WP. Это полезно для предупреждений из файлов ядра или плагинов, которые не следует изменять.

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

<?php 
error_reporting(E_ALL & ~E_WARNING & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);
?>

Как упомянул mmm:

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

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

error_reporting(0);

Я пробовал вышеупомянутые функции, которые вы ввели, и вставлял их в мой wp-config.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 вашей темы, вы скроете все ошибки устаревания.

error_reporting(error_reporting() & ~E_DEPRECATED);

Вы можете сделать это так, чтобы оставалась возможность отладки, когда это необходимо :

Пример (разместите это в 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);
        }
    }
});

.

Ответ или решение

Подавление устаревших уведомлений в PHP-среде, и конкретно в контексте настройки WordPress, — это важная задача для ИТ-специалистов, работающих с устаревшими темами и плагинами. В данном случае, проблема состоит в том, что стандартная настройка конфигурационного файла WordPress может выводить устаревшие уведомления, которые не всегда являются критичными для выполнения скриптов, но могут засорять журналы и влиять на производительность сайта. Давайте рассмотрим, как можно эффективно подавить эти уведомления.

Теория

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

WordPress, как широко используемая платформа, часто сталкивается с устаревшими предупреждениями, особенно при использовании старых тем и плагинов. Стандартный метод разработки в WordPress предполагает использование константы WP_DEBUG для отображения ошибочных и устаревших уведомлений во время разработки.

Пример

Вы использовали следующий код в wp-config.php для включения режима отладки:

define('WP_DEBUG', 1);

Однако вы хотите подавить сообщения об устаревших функциях, возникающие при использовании старой темы. Попытка изменить уровни отчетности об ошибках через error_reporting(E_ERROR | E_NOTICE | E_PARSE) в wp-config.php или в файле header.php темы не дала ожидаемых результатов. Также настройка ini_set('display_errors', 1); не привела к изменению ситуации.

Приведенные выше примеры показывают, что часто простое добавление или изменение кодов в файлах тем или конфигурации может быть неэффективным, поскольку настройки могут быть переопределены серверными установками или другими плагинами.

Применение

  1. Создание Must-Use Плагина:

    Создание must-use плагина является одним из эффективных способов подавления устаревших уведомлений. Такие плагины загружаются на ранних этапах и имеют больший приоритет, чем стандартные плагины. Создайте PHP файл в директории /wp-content/mu-plugins/ со следующим содержимым:

    <?php
    error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);

    Данный подход позволяет подавлять устаревшие уведомления на уровне всей платформы.

  2. Использование Фильтра WordPress:

    Вы можете использовать предоставленный фильтр WordPress для настройки отчетности об ошибках до загрузки плагинов:

    $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', 0);
                       }
                       return false;
                   },
               ),
           ),
       ),
    );

    Этот код следует размещать после всех объявлений констант в wp-config.php.

  3. Подавление Уведомлений в Конкретных Скриптах:

    Если проблема заключается в определенном файле, вставьте следующий код сразу после тега <?php в этом файле:

    error_reporting(0);

    Это окончательно отключит все уведомления для данного файла, что может быть полезным в специфических случаях.

  4. Динамическое Управление Отчетностью:

    Добавление динамического управления в functions.php может предоставить гибкость, которая необходима для переключения между различными уровнями отчетности в зависимости от условий:

    add_action('wp_loaded', function() {
       if (WP_DEBUG === false) {
           error_reporting(0);
       } else {
           error_reporting(E_ALL & ~E_WARNING & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_NOTICE);
       }
    });

    Таким образом, будет активирована минимальная необходимая отчетность об ошибках в зависимости от текущей ситуации.

Подводя итог, подавление устаревших уведомлений в WordPress требует понимания того, как и когда PHP обрабатывает ошибки. Разработка с учетом устаревших предупреждений способствует не только улучшению качества кода, но и стабильности работающей системы. Выбор подхода, который лучше всего соответствует вашим конкретным условиям и требованиям, является первым шагом к реализации чистого, быстрого и безопасного окружения для разработки и эксплуатации.

Оцените материал
Добавить комментарий

Капча загружается...