显示PHP错误从admin-ajax.php在WordPress 4.9+

yyyllmsg  于 2023-06-04  发布在  PHP
关注(0)|答案(5)|浏览(217)

我们已经设置了一些自定义端点来执行各种操作,我们通过/wp/wp-admin/admin-ajax.php?action=some_action访问这些端点
然而,当我们在开发过程中出现错误时,例如语法,逻辑,致命等,我们在浏览器中查看页面时只会得到“500内部服务器错误”。
当网站上的其他页面出现错误时,它会给我们PHP错误,以帮助我们调试。
但是,当错误来自admin-ajax.php区域时,我们必须打开PHP日志文件来查看错误-这在积极开发时更是一种痛苦
WordPress中是否有禁止显示此URL名称空间上的错误的东西?如果是这样,我们如何防止这种情况,以允许在浏览器上呈现错误?

0dxa2lsx

0dxa2lsx1#

x1c 0d1x如果你想在 AJAX 时看到PHP错误,打开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 错误了。请记住在调试完成后撤消此操作!

blmhpbnm

blmhpbnm2#

更好的解决方案

在错误发生前启用PHP错误输出
添加此选项以启用PHP错误输出

@ini_set( 'display_errors', 1 );

例:在本例中,在 AJAX 回调函数的开始

提示:

您可以使用Dev Tools Network中Response选项卡旁边的Preview选项卡来呈现Error输出中的HTML。这样你就可以看到没有HTML的错误

说明

我不知道为什么WordPress不允许启用此错误输出,但我不认为编辑WordPress核心文件并在调试后撤消它们不是一个好主意,因为回答here
从这个答案中,我发现我们只需要将display_errors PHP init设置为true1就可以输出错误。
那么为什么我们不把它设置在任何我们希望它工作的地方,这样这个display_errors就只在那个范围内启用了。
如果你不像其他答案那样撤消这个就没有问题

svmlkihl

svmlkihl3#

编辑wp-includes/class-wp-fatal-error-handler.php并在display_default_error_template( $error, $handled )中进行更改(行:193):

$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.' )
                );

然后使用开发工具预览admin-ajax.php的HTML响应。

hfyxw5xn

hfyxw5xn4#

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 );

定义如下常量。您将能够在wp-content下看到debug.log。我通常也会关闭调试显示,因为它会导致已经发送的头出现问题。
编辑:
因此,很明显,在wp-includes/load.php中的方法wp_debug_mode()的最后一行中, AJAX 请求的错误报告被关闭了。

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

waxmsbnn5#

要 AJAX 调用启用调试模式,您可以通过在/* That's all, stop editing! Happy publishing. */行之前添加以下行来编辑wp-config.php

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

这会阻止WordPress干扰错误报告。(参见wp-includes/load.php中函数wp_debug_mode的注解。)
现在您已经有了调试模式的默认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处理错误,现在完全控制了自己。

相关问题