Отображение ошибок PHP из admin-ajax.php в Wordpress 4.9+

У нас есть настроенные конечные точки, которые выполняют различные действия, к которым мы получаем доступ через /wp/wp-admin/admin-ajax.php?action=some_action

Однако всякий раз, когда в процессе разработки возникает ошибка, такая как синтаксис, логика, фатальная ошибка и т. Д., Мы просто получаем "500 Internal Server Error" при просмотре страницы в браузере.

Каждая другая страница на сайте, когда есть ошибка, дает нам ошибку PHP, чтобы помочь нам отладить.

Однако, когда ошибка исходит от admin-ajax.php область, мы должны затем открыть наш файл журнала PHP, чтобы увидеть ошибку вместо этого - что больше боли при активной разработке

Есть ли что-то в WordPress, что отключает отображение ошибок в этом пространстве имен URL? и если да, то как мы можем предотвратить это, чтобы сделать возможным отображение ошибок в браузере?

5 ответов

введите описание изображения здесь Если вы хотите увидеть ошибки PHP при использовании ajax, откройте файл wp-includes/load.php и в строке 336 измените эту строку:

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 0 );
    }

в

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 1 );
    }

Теперь вы сможете увидеть ошибки ajax в консоли браузера. Не забудьте отменить это, когда закончите отладку!

Лучшее решение

Включите вывод ошибок PHP до появления ошибки

Добавьте это, чтобы включить вывод ошибок PHP

      @ini_set( 'display_errors', 1 );

Например: в этом случае в начале функции обратного вызова ajax

Кончик:

Вы можете использовать вкладку Preview рядом с вкладкой Response в Dev Tools Network, чтобы отобразить HTML в выходных данных Error. Чтобы вы могли увидеть ошибку без HTML

Объяснение

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

Из этого ответа я обнаружил, что нам просто нужно установить для параметра PHP init значение или же для вывода ошибок.

Так почему бы нам просто не установить это там, где мы хотим, чтобы это работало, чтобы это будет включен только для этой области.

Нет проблем, если вы не отменили это, в отличие от другого ответа

Редактировать wp-includes/class-wp-fatal-error-handler.php и измените это в display_default_error_template( $error, $handled ):

$message = sprintf(
                        '<p>%s</p><p><a href="%s">%s</a></p>',
                        $message,
                        /* translators: Documentation explaining debugging in WordPress. */
                        __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
                        __( 'Learn more about debugging in WordPress.' )
                );

к

$message = sprintf(
                        '<p>%s</p><p><a href="%s">%s</a></p>',
                        $message . ' ' . json_encode($error),
                        /* translators: Documentation explaining debugging in WordPress. */
                        __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
                        __( 'Learn more about debugging in WordPress.' )
                );

Затем просмотрите HTML-ответ на admin-ajax.php с помощью Dev Tools.

https://codex.wordpress.org/Debugging_in_WordPress

 // Enable WP_DEBUG mode
define( 'WP_DEBUG', true );

// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );

// Disable display of errors and warnings 
define( 'WP_DEBUG_DISPLAY', false );

Определите следующие константы как таковые. Вы сможете увидеть debug.log под wp-content, Я обычно тоже отключаю отображение отладки, потому что это вызывает проблему с уже отправленными заголовками.

РЕДАКТИРОВАТЬ:

Таким образом, по-видимому, отчеты об ошибках отключены для запросов AJAX в последней строке метода wp_debug_mode() в wp-includes/load.php

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 0 );
    }

Чтобы включить режим отладки также для вызовов ajax, вы можете отредактировать, добавив следующие строки перед строкой/* That's all, stop editing! Happy publishing. */:

      $GLOBALS['wp_filter'] = array(
    'enable_wp_debug_mode_checks' => array(
        10 => array(
            array(
                 'accepted_args' => 0,
                 'function'      => function() {
                     return false;
                 },
             ),
         ),
     ),
);

Это не позволит WordPress вмешиваться в отчеты об ошибках. (См. комментарии к функцииwp_debug_modeвwp-includes/load.php.) Документы

Теперь у вас есть настройки PHP по умолчанию для режима отладки. Чтобы самостоятельно управлять настройками, добавьте следующие строки в свойwp-config.phpфайл:

      error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
ini_set( 'log_errors', 1 );
ini_set( 'error_log', ABSPATH . "wp-content/debug.log" );

Поздравляю! Вы успешно обошли WordPress и теперь полностью контролируете это сами.

Другие вопросы по тегам