如何在 WooCommerce 3+ 中进行调试

Posted

技术标签:

【中文标题】如何在 WooCommerce 3+ 中进行调试【英文标题】:How to debug in WooCommerce 3+ 【发布时间】:2020-08-27 14:36:14 【问题描述】:

我正在使用本教程 https://docs.woocommerce.com/document/shipping-method-api/ 为 Woocommerce 创建自定义运输方式,但我在调试时遇到问题。每当用户更新运输方式时,Woocommerce 调用都会计算运输。我已经用以下内容覆盖了这个函数。

public function calculate_shipping( $package ) 
    // This is where you'll add your rates
    $rate = array(
      'idea' => $this->id,
      'label' => $this->title,
      'cost' => '90.00',
      'calc_tax' => 'per_item'
    );
    echo "<script>console.log('Calculating shipping');</script>";
    $this->add_rate($rate);
  

最后,我有一个相当复杂的计算“成本”的方法,但我无法调试它,因为该 echo 行在 chrome 控制台中不会产生任何输出。有什么想法吗?

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

由于这是服务器端的后台进程,请勿使用 javascript

1)。 WooCommerce 中的 WC 日志和 WC_Logger Class 用于更好地调试

要从仪表板轻松访问日志结果,您可以登录到 WC 记录器,而不是错误日志。

您可以通过转到 WooCommerce > 系统状态 > 日志来访问错误日志。

然后您将能够选择并“查看”您需要的错误日志文件,为您提供所需的调试详细信息。错误日志也位于站点安装中的 /wc-logs 文件夹中。

对捕获的异常运行堆栈跟踪(示例):

// Log any exceptions to a WC logger
$log = new WC_Logger();
$log_entry = print_r( $e, true );
$log_entry .= 'Exception Trace: ' . print_r( $e->getTraceAsString(), true );
$log->log( 'new-woocommerce-log-name', $log_entry );

注意事项:

WC_Logger methods 自 WooCommerce 3 以来已更新:因此可以按上下文和严重性对日志进行分组。

由于upcoming deprecation,请使用WC_Logger log() method 而不是add() method (感谢@Vizz85)

例如:

$logger = wc_get_logger();
$logger->debug( 'debug message', array( 'source' => 'my-extension' ) );

相关:

开发 WooCommerce 博客(2017 年 1 月):Improved logging in WooCommerce 3 WC_Logger available methods 上的文档

2)。 使用 WordPress WP_DEBUG Log 进行调试 (作为替代)

a) 首先编辑您的 wp-config.php 文件,添加以下行以启用调试(如果这些已定义,请编辑值):

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

记录错误时,它们应该出现在wp-content/debug.log 中。您可以在文本编辑器中打开此文件。

b) 在您的代码中:使用以下代码(其中$variable 是要在错误日志中显示的变量:

error_log( print_r( $variable, true ) );

现在您将获得用于调试的数据。

【讨论】:

这行得通,但我团队中的其他开发人员输出了太多垃圾到 debug.log,几乎不可能从我的插件中找到输出。我想我可以只写一个 .txt 文件,但这也不起作用。我是***的新手,我不确定规则。我应该为此创建一个新问题吗? @DallinDavis 我已经更新了我的答案……WooCommerce 中有 WC_Logger 特殊类对调试非常有用……见上文。 只是想提一下,WC_Logger::log 应该优先于 WC_Logger::add,因为未来可能会被弃用:WooCommerce docs @Vizz85 是的,你完全正确......我更新了我的答案并添加了一个小笔记来感谢你。谢谢。【参考方案2】:

首先创建 PHP 辅助函数

 function console_output($data) 
 $output = $data;
if (is_array($output))
    $output = implode(',', $output);

  echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
 

那么你可以这样使用它:

public function calculate_shipping( $package ) 
// This is where you'll add your rates
$rate = array(
  'idea' => $this->id,
  'label' => $this->title,
  'cost' => '90.00',
  'calc_tax' => 'per_item'
     );
   console_output("Calculating shipping");
    $this->add_rate($rate);
   

这将创建如下输出:

  Debug Objects: Calculating shipping

【讨论】:

以上是关于如何在 WooCommerce 3+ 中进行调试的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 3 中获取订单运送物品的详细信息

php [WooCommerce插件开发人员手册]记录可用于调试目的的WooCommerce数据。

php [WooCommerce插件开发人员手册]记录可用于调试目的的WooCommerce数据。

如何在 phpMyAdmin 中轻松访问所有帖子标题以从 WooCommerce 进行编辑?

如何在 WooCommerce 3 中添加自定义工作运输方式

我如何更好地在 woocommerce rest api 中按类别对产品进行分组?