Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get user orders by date in woocommerce?

I'm looking for a standard way of getting a user total sum of orders in a date range or for current month.

After exploring woocommerce source code, what I got is, woo is using something like this

            $order_item_amounts = $this->get_order_report_data( array(
            'data' => array(
                '_line_total' => array(
                    'type'            => 'order_item_meta',
                    'order_item_type' => 'line_item',
                    'function' => 'SUM',
                    'name'     => 'order_item_amount'
                ),
                'post_date' => array(
                    'type'     => 'post_data',
                    'function' => '',
                    'name'     => 'post_date'
                ),
                '_product_id' => array(
                    'type'            => 'order_item_meta',
                    'order_item_type' => 'line_item',
                    'function'        => '',
                    'name'            => 'product_id'
                ),
            ),
            'where_meta' => array(
                'relation' => 'OR',
                array(
                    'type'       => 'order_item_meta',
                    'meta_key'   => array( '_product_id', '_variation_id' ),
                    'meta_value' => $this->product_ids,
                    'operator'   => 'IN'
                ),
            ),
            'group_by'     => 'product_id, ' . $this->group_by_query,
            'order_by'     => 'post_date ASC',
            'query_type'   => 'get_results',
            'filter_range' => true
        ) );

in class-wc-report-sales-by-product.php

But as you know, this works based on products not users. from the above code, $this->group_by_query part holds the conditions for dates which can be found in woo source. My question is actually about how to use a builtin function of woocommerce to generate a list of orders based on given date range.

Thanks

like image 978
Mehran Avatar asked Feb 02 '16 06:02

Mehran


People also ask

How would you obtain a customer's order details from WooCommerce?

One way is to simply go to the “Customers” page in your WordPress admin panel. From there, you can click on any customer to view their complete details. Another way to get customer details is through the WooCommerce REST API. This allows you to programmatically get information about customers, orders, etc.

How do I get order time in WooCommerce?

if you have the order ID then use the following code to fetch order date. $order = new WC_Order($order_id); $order_date = $order->order_date; Have any doubt, then comment here!

How do I check my WooCommerce database orders?

WooCommerce stores all of your orders in a database table called wp_woocommerce_orders. You can access this data by logging into your WordPress database or by using a tool like phpMyAdmin. The data in this table includes the order ID, customer ID, billing and shipping address, payment method, order items, and more.

How do I search multiple orders in WooCommerce?

Once you enter the products, click on Run search to filter your orders by multiple products.


1 Answers

From your answer here, which I believe is correct.

You just need to add the date_query in the fields... something like this:

public function get_customer_total_order() {
    $customer_orders = get_posts( array(
        'numberposts' => - 1,
        'meta_key'    => '_customer_user',
        'meta_value'  => get_current_user_id(),
        'post_type'   => array( 'shop_order' ),
        'post_status' => array( 'wc-completed' ),
        'date_query' => array(
            'after' => date('Y-m-d', strtotime('-10 days')),
            'before' => date('Y-m-d', strtotime('today')) 
        )

    ) );

    $total = 0;
    foreach ( $customer_orders as $customer_order ) {
        $order = wc_get_order( $customer_order );
        $total += $order->get_total();
    }

    return $total;
}

Additional Readings:

DATE FORMATS

inline with the question on how to use get_order_report_data, you can do it this way... you can paste this in your functions.php on the theme to test.

include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php');

$reports = new WC_Admin_Report();
$args = array(
    'data' => array(
        '_order_total' => array(
            'type'     => 'meta',
            'function' => 'SUM',
            'name'     => 'total_sales'
        ),
    ),
    'where' => array(
        array(
            'key'      => 'post_date',
            'value'    => date( 'Y-m-d', strtotime( '01/01/2016' ) ), // starting date
            'operator' => '>'
        ),
        array(
            'key'      => 'post_date',
            'value'    => date( 'Y-m-d', strtotime( '02/01/2016' ) ), // end date...
            'operator' => '<'
        ),
    ),
    'where_meta' => array(
        array(
            'meta_key'   => '_customer_user',
            'meta_value' => '1', // customer id
            'operator'   => '='
        )
    ),
);
$data = $reports->get_order_report_data($args);
print_r($data); // prints like: stdClass Object ( [total_sales] => 200 )

Please take note of the comments in the codes above...

like image 178
Reigel Avatar answered Sep 21 '22 19:09

Reigel