【问题标题】:Display Customer total spent without shipping in Woocommerce显示客户在 Woocommerce 中未发货的总支出
【发布时间】:2019-03-28 17:42:45
【问题描述】:

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

我在第 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();

我非常感谢任何类型的帮助。

【问题讨论】:

    标签: php sql wordpress woocommerce orders


    【解决方案1】:

    更新 2

    无法使用wc_get_customer_total_spent( $user_id ) 函数获取客户总支出而不包含运费和税金总额,因为您需要为当前客户所做的每个订单删除税金和运费。 p>

    你也不能在你的函数中获取和使用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;
    }
    

    经过测试并且完美运行。

    计算说明:

    当您从订单中移除总税费时,您不需要移除运费税(因为它们包含在总税费中)。

    所以我们只删除了总税费和总运费(不含税)。

    【讨论】:

    • 使用您提供的新功能会导致致命错误。从末尾删除一个 ) 会使站点再次工作,但会出现此错误:致命错误:未捕获的错误:调用成员函数 get_total_tax()
    • 是的,我注意到了。从一开始的函数是这样的: public static function users_custom_column( $value, $column_name, $user_id ) { if ( 'money_spent' != $column_name ) { return $value; } 其他 { $money_spent = wc_get_customer_total_spent( $user_id );返回 wc_price(wc_get_customer_total_spent ($user_id));但它显示了运费。税收很好,需要从等式中删除运费。
    • @WooDevil 好的,我找到了方法并更新了我的答案。
    • 谢谢!我刚刚从 SELECT SUM(pm2.meta_value - (pm3.meta_value + pm4.meta_value)) 中删除了 pm3.meta_value 以获得总和而无需运输。非常感谢!!
    猜你喜欢
    • 2019-03-15
    • 2020-11-12
    • 2022-01-11
    • 2017-02-11
    • 2012-12-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多