显示客户在Woocommerce中未运送的总支出

时间:2018-10-24 10:34:18

标签: php sql wordpress woocommerce orders

我试图显示每个客户总共花了多少钱,而没有包括运费。除了计算之外,下面代码中的所有内容(创建一个新列并使其可排序)都可以正常工作。

第37行出现错误:

$money_spent = wc_get_customer_total_spent( $user_id ) - $order->get_total_tax() - $order->get_total_shipping() - $order->get_shipping_tax(), wc_get_price_decimals(), '.', '' );

这是我使用的所有代码=>

class Total_Spent_By_Customer_WooCommerce {

    public function __construct() {
        add_action( 'init', array( &$this, 'init' ) );
    }

    public function init() {
    add_filter( 'manage_users_columns', array( $this,'users_columns') );
    add_action( 'manage_users_custom_column',  array( $this ,'users_custom_column'), 10, 3);
    add_filter( 'manage_users_sortable_columns', array( $this ,'users_sortable_columns') );
    add_filter( 'users_list_table_query_args', array( $this ,'users_orderby_column'), 10, 1 );
    add_action( 'plugins_loaded', array( $this ,'load_this_textdomain') );
  }

  public static function users_columns( $columns ) {
    unset($columns['posts']);
    $columns['money_spent'] = _x( 'Money Spent', 'user', 'total-spent-by-customer-for-woocommerce' );
    return $columns;
  }

  public static function users_custom_column( $value, $column_name, $user_id ) {
    if ( 'money_spent' != $column_name ) {
      return $value;
    } else {
      $money_spent = wc_get_customer_total_spent( $user_id ) - $order->get_total_tax() - $order->get_total_shipping() - $order->get_shipping_tax(), wc_get_price_decimals(), '.', '' );
      return wc_price( wc_get_customer_total_spent ( $user_id ));
    }
  }

  public static function users_sortable_columns($columns) {
    $custom = array(
      'money_spent'    => 'money_spent',
    );

    return wp_parse_args( $custom, $columns );
  }

  public static function users_orderby_column( $args ) {
    if ( isset( $args['orderby'] ) && 'money_spent' == $args['orderby'] ) {
      $args = array_merge( $args, array(
        'meta_key' => '_money_spent',
        'orderby'    => 'meta_value_num',
      ));
    }

    return $args;
  }

  public function load_this_textdomain() {
    load_plugin_textdomain( 'total-spent-by-customer-for-woocommerce' );
  }
}

new Total_Spent_By_Customer_WooCommerce();

我真的很感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

更新2

使用wc_get_customer_total_spent( $user_id )函数无法获得没有运费和税金总额的客户总支出,因为您需要删除当前客户已完成的每个订单的税金和运费。

此外,您无法在函数中获取和使用WC_Order对象。因此无法使用WC_Order方法get_total_tax()get_total_shipping()get_shipping_tax()


替代方式:无需花费运费和税金即可获得客户的总支出:

基于wc_get_customer_total_spent()函数所涉及的the SQL Woocommerce query source code,我们可以构建您自己的查询。

因此您将用以下代码替换功能:

public static function users_custom_column( $value, $column_name, $user_id ) {
    if ( 'money_spent' == $column_name ) {
        global $wpdb;

        $statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );

        $spent    = $wpdb->get_var("
            SELECT SUM(pm2.meta_value - (pm3.meta_value + pm4.meta_value))
            FROM $wpdb->posts as p
            LEFT JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
            LEFT JOIN {$wpdb->postmeta} AS pm2 ON p.ID = pm2.post_id
            LEFT JOIN {$wpdb->postmeta} AS pm3 ON p.ID = pm3.post_id
            LEFT JOIN {$wpdb->postmeta} AS pm4 ON p.ID = pm4.post_id
            WHERE   pm.meta_key   = '_customer_user'
            AND     pm.meta_value = '" . esc_sql( $user_id ) . "'
            AND     p.post_type   = 'shop_order'
            AND     p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
            AND     pm2.meta_key  = '_order_total'
            AND     pm3.meta_key  = '_order_tax'
            AND     pm4.meta_key  = '_order_shipping'
        ");

        if ( ! $spent ) {
            $spent = 0;
        }
        $value = wc_price( $spent );
    }
    return $value;
}

经过测试,效果很好。

  

计算注释:

     

当您从订单中删除总税时,无需删除运输税(因为它们已包含在总税中)。

     

因此,我们只删除总税额和总运费(不包括税额)。