Duke Yin's Technology database

WordPress 将Debug写入文件

在wp-config中打开debug后,出错会直接显示在前端,但这会影响成品站点的用户体验,添加如下两个定义后可以不显示在前端,并且记录在wp-content/debug.log中。

define( 'WP_DEBUG_LOG', true ); 
define( 'WP_DEBUG_DISPLAY', false );

但是由于WordPress内核本身年代久远,如果你使用新的PHP版本比如8,log将会记录大量由WordPress本身造成的deprecated的提示,虽然官方文档针对log的等级可以用如下来设置:

error_reporting( E_ALL & ~E_DEPRECATED );

但是由于wp-config加载比较靠前,错误报告设置极大可能会被后面的某一些项给改写。我尝试过在新安装的WordPress中,剔除Depreacated信息都是不起作用的。

所以有了如下解决方案:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
$GLOBALS['wp_filter'] = array(
        'enable_wp_debug_mode_checks' => array(
            10 => array(
                array(
                    'accepted_args' => 0,
                    'function'      => function () {
                        if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
                            // *** This is the key line - change to adjust to whatever logging state you want
                            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;
                    },
                ),
            ),
        ));

使用wp_filter去处理,不会被覆写,有多种情况处理,log文件不记录depracated信息,甚至你可以根据自己的需求去编辑log等级。

发布评论

评论

标注 * 的为必填项。