Отображение общей суммы потраченных без доставки клиентов в Woocommerce - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь показать, сколько каждый клиент потратил в общей сложности БЕЗ стоимости доставки.Все из приведенного ниже кода, который создает новый столбец и делает его сортируемым, работает нормально, за исключением вычисления.

Я получаю сообщение об ошибке в строке 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 голосов
/ 24 октября 2018

Обновление 2

Вы не можете получить Всего потраченных клиентов без доставки и общей суммы налогов с использованием функции wc_get_customer_total_spent( $user_id ), так как вам необходимо удалить налоги идоставка для каждого заказа, который сделал текущий клиент.

Также вы не можете получить и использовать объект WC_Order в своей функции.Таким образом, WC_Order методы get_total_tax(), get_total_shipping() и get_shipping_tax() не могут быть использованы.


Альтернатива для получения общей суммы расходов клиента без доставки и налогов:

Исходя из исходного кода запроса SQL Woocommerce , задействованного в функции wc_get_customer_total_spent(), мы можем создать собственный запрос.

Таким образом, вы замените свою функцию следующим образом:

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;
}

Проверено и отлично работает.

Примечание по расчетам:

Поскольку вы убираете все налоги из заказов, вам не нужно удалять налоги на доставку (так как они включены в общую сумму налогов).

Таким образом, мы просто удаляем общие налоги и общую суммудоставка (без учета налогов).

...