自定义Woocommerce报告时间间隔

时间:2015-08-27 15:26:41

标签: filter woocommerce report hook

我需要在报告标签中插入last4Days选项。 我已经通过更改原始文件完成了这一点,但WooCommerce在一段时间后不断更改为原始文件。 所以我试图找到一个过滤器来做到这一点,但我找不到它。

1 个答案:

答案 0 :(得分:1)

不幸的是,Woo团队没有做用户友好的事情,并在报告长度参数上包含一个过滤器。缺少一些元编程魔法(比如在加载之前动态覆盖.php文件的文本中的参数,非常危险)我能看到的唯一方法是将实例化阶梯上升到生成报告的点,并且然后根据您使用的那个调用自定义类。幸运的是,WooCommerce确实为报告文件的路径提供了一个过滤器,它位于wc-class-admin-reports.php,钩子被称为wc_admin_reports_path。如果我们扩展优惠券使用情况报告,它看起来有点像:

add_filter('wc_admin_reports_path', 'redirect_coupon_report_class_path', 10, 2);
function redirect_coupon_report_class_path($path, $report_name, $class) {
  if($report_name == 'coupon-usage') {
    $path = 'path/to/my/custom/class.php';
  }
  return $path;
}

您需要做的是复制您尝试更改的报告的类,并将其粘贴到主题或插件中的某个位置。然后,添加一个调用函数的过滤器,该函数将检查传入的报表是否是您要修改的报表,并将其重定向到您的自定义类。在您的自定义类中,您可以执行任何您想要的操作,但与任何覆盖一样,您将希望在每次更新时看到它们在该文件中更改的内容。您可以像这样扩展类:

class WC_Report_Coupon_Usage_Custom extends WC_Report_Coupon_Usage {

   // Call the parent constructor
   function __construct() {
     parent::__construct();
   }

   // Add a method that you would have previously overwritten directly in the plugin file
   public function output_report() {

        $ranges = array(
            'year'         => __( 'Year', 'woocommerce' ),
            'last_month'   => __( 'Last Month', 'woocommerce' ),
            'month'        => __( 'This Month', 'woocommerce' ),
            '7day'         => __( 'Last 7 Days', 'woocommerce' ),
            '4day'         => __( 'Last 4 Days', 'woocommerce' )
        );

        $this->chart_colours = array(
            'discount_amount' => '#3498db',
            'coupon_count'    => '#d4d9dc',
        );

        $current_range = ! empty( $_GET['range'] ) ? sanitize_text_field( $_GET['range'] ) : '7day';

        if ( ! in_array( $current_range, array( 'custom', 'year', 'last_month', 'month', '7day' ) ) ) {
            $current_range = '7day';
        }

        $this->calculate_current_range( $current_range );

        include( WC()->plugin_path() . '/includes/admin/views/html-report-by-date.php');
    }

}