调试 PHP 代码是任何项目的一部分,但 WordPress 配备了特定的调试系统,旨在简化该过程并标准化核心、插件和主题中的代码。本文档介绍了 WordPress 中可用的各种调试工具以及如何在编码时提高效率,同时提高代码的整体质量和互操作性。

对于非程序员或普通用户,这些选项可用于显示有关错误的详细信息。

注意:在对网站进行任何修改之前,请验证您是否已使用测试环境或对网站进行了适当的备份。

调试用的 wp-config.php 示例

以下代码插入到您的 wp-config.php 文件中,会将所有错误、通知和警告记录到 wp-content 目录中名为 debug.log 的文件。它还会隐藏这些错误,以免中断页面生成。

// 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 );
@ini_set( 'display_errors', 0 );
// Use dev versions of core JS and CSS files (only needed if you are modifying these core files)
define( 'SCRIPT_DEBUG', true );

注意:您必须将此内容插入到 wp-config.php 文件中的 /* That's all, stop editing! Happy blogging. */ 之前。

WP_DEBUG

WP_DEBUG 是一个 PHP 常量(永久全局变量),可用于在整个 WordPress 中触发“调试”模式。默认情况下假设为 false,通常在开发版本的 WordPress 的 wp-config.php 文件中将其设置为 true。

// This enables debugging.
define( 'WP_DEBUG', true );
// This disables debugging.  
define( 'WP_DEBUG', false );

注意:示例中的 true 和 false 值没有用撇号(')包围,因为它们是布尔值(true/false)。如果您将常量设置为 'false',它们将被解释为 true,因为引号使其成为字符串而不是布尔值。

不建议在实时网站上使用 WP_DEBUG 或其他调试工具;它们专为本地测试和测试安装而设计。

PHP 错误、警告和通知

启用 WP_DEBUG 将导致显示所有 PHP 错误、通知和警告。这可能会修改 PHP 的默认行为,即仅显示致命错误或遇到错误时显示白屏。

显示所有 PHP 通知和警告通常会导致出现一些看似没有损坏但内部不符合 PHP 适当数据验证约定的错误消息。一旦识别出相关代码,这些警告很容易修复,生成的代码几乎总是更不容易出错且更容易维护。

自定义 PHP 调试

如果出于调试目的需要记录非错误信息,PHP 确实提供了 error_log 函数用于此目的。但是,默认情况下此方法不提供正确格式的输出。

为了解决这个问题,您可以在网站上添加另一个函数来处理格式化,方法是创建一个 自定义插件 或使用带有某些 代码片段 插件的代码片段。该函数将作为 error_log 的包装器,使用 print_r 在记录之前正确格式化数组和对象。

下面是一个需要启用 WP_DEBUG 的示例函数。

function write_log( $data ) {
    if ( true === WP_DEBUG ) {
        if ( is_array( $data ) || is_object( $data ) ) {
            error_log( print_r( $data, true ) );
        } else {
            error_log( $data );
        }
    }
}

使用示例:

write_log( 'DEBUG TEXT' );
write_log( $variable );

注意:不建议在 functions.php 中添加上述示例之类的自定义代码,以避免维护、安全、性能、兼容性和代码组织问题。

已弃用的函数和参数

启用 WP_DEBUG 还将导致显示 WordPress 中使用的关于已弃用函数和参数的通知。这些是尚未从核心代码中删除但计划近期删除的函数或函数参数。弃用通知通常指示应使用的新函数。

WP_DEBUG_LOG

WP_DEBUG_LOG 是 WP_DEBUG 的配套功能,可将所有错误保存到 debug.log 日志文件。如果您想稍后查看所有通知或需要查看离线生成的通知(例如在 AJAX 请求或 wp-cron 运行期间),这非常有用。

请注意,这允许您使用 PHP 内置的 error_log() 函数写入日志文件,这在调试 Ajax 事件时可能很有用。

设置为 true 时,日志将保存到内容目录(通常是 wp-content/debug.log)中的 debug.log。或者,您可以将其设置为有效的文件路径以在其他位置保存文件。

define( 'WP_DEBUG_LOG', true );

-或-

define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' );

注意:对于 WP_DEBUG_LOG 起作用,必须启用 WP_DEBUG(true)。请记住,您可以独立关闭 WP_DEBUG_DISPLAY。

WP_DEBUG_DISPLAY

WP_DEBUG_DISPLAY 是 WP_DEBUG 的另一个配套功能,控制是否在页面的 HTML 中显示调试消息。默认值为 'true',会显示生成的错误和警告。将此设置为 false 将隐藏所有错误。这应与 WP_DEBUG_LOG 一起使用,以便稍后审查错误。

define( 'WP_DEBUG_DISPLAY', false );

注意:对于 WP_DEBUG_DISPLAY 起作用,必须启用 WP_DEBUG(true)。请记住,您可以独立控制 WP_DEBUG_LOG。

SCRIPT_DEBUG

SCRIPT_DEBUG 是一个相关的常量,它将强制 WordPress 使用核心 CSS 和 JavaScript 文件的“开发”版本,而不是通常加载的压缩版本。当您测试对任何内置 .js 或 .css 文件的修改时,这非常有用。默认值为 false。

define( 'SCRIPT_DEBUG', true );

SAVEQUERIES

SAVEQUERIES 定义将数据库查询保存到数组中,然后可以显示以帮助分析这些查询。当常量设置为 true 时,它会导致保存每个查询以及执行所需的时间和调用它的函数。

define( 'SAVEQUERIES', true );

该数组存储在全局 $wpdb->queries 中。

注意:这将对您的网站性能产生影响,因此请确保在不调用调试时关闭此功能。

调试插件

有许多 调试插件 可用于 WordPress,显示有关内部组件或一般信息的更多信息。

例如,Debug Bar 在管理栏中添加了一个调试菜单,显示查询、缓存和其他有用的调试信息。当启用 WP_DEBUG 时,它还会跟踪 PHP 警告和通知,以便更容易找到它们。

自动化测试和逐步调试

日志和调试插件可用于查找运行时错误,但某些问题通过自动化测试或逐步调试器进行调查会更简单。

PHPUnit 用于 WordPress 开发中的自动化 PHP 测试。测试可以帮助确认代码按预期运行,并可以防止相同的错误以后再次出现。对于插件项目,WP-CLI 可以生成插件测试文件。

Xdebug 是一个 PHP 扩展,可用于与兼容编辑器或 IDE 进行逐步调试。它允许您在代码运行时暂停、检查变量并跟踪调用栈。当日志消息不足以解释问题时,这可能会有所帮助。

在本地开发或测试环境中使用这些工具,而不是直接在生产网站上使用。