Get orders by date and status woocommerce

18,162

Solution 1

You can use wc_get_orders

$initial_date = yyyy-mm-dd;
$final_date = yyyy-mm-dd;
$orders = wc_get_orders(array(
    'limit'=>-1,
    'type'=> 'shop_order',
    'status'=> array( 'wc-completed','wc-refunded' ),
    'date_created'=> $initial_date .'...'. $final_date 
    )
);

Solution 2

How about using custom wpdb query like this?

global $wpdb;

$date_from = '2015-11-20';
$date_to = '2015-12-20';
$post_status = implode("','", array('wc-processing', 'wc-completed') );

$result = $wpdb->get_results( "SELECT * FROM $wpdb->posts 
            WHERE post_type = 'shop_order'
            AND post_status IN ('{$post_status}')
            AND post_date BETWEEN '{$date_from}  00:00:00' AND '{$date_to} 23:59:59'
        ");

echo "<pre>";
print_r($result);
Share:
18,162

Related videos on Youtube

A.Verta
Author by

A.Verta

Updated on June 04, 2022

Comments

  • A.Verta
    A.Verta almost 2 years

    I need get a list of orders in woocommerce passing start date, final date and status.

    I tryed use some techniques like described by Mike Jolley, and I mixed with this. But I have not had success. This return all orders. I´m using the woocommerce version 2.2.10.

    Thanks for help.

    My code:

    public function get_orders(){
            global $json_api;
            $initial_date = $json_api->query->para1;
            $final_date = $json_api->query->para2;
            $order_id = $json_api->query->para3;
            $status_order = $json_api->query->para4;
    
            define('GET_ORDERS_FILTER_DATE_FROM', $initial_date );
            define('GET_ORDERS_FILTER_DATE_TO', $final_date );
            add_filter('posts_where', array( __CLASS__, 'get_orders_where_dates_between') );
            $orders = get_posts( array(
                'post_type'   => 'shop_order',
                'orderby' => 'post_date',
                'order'     => 'DESC',
                'post_status' => array_keys( $status_order )
            ) );
            remove_filter('posts_where', 'order_page_get_orders_where_dates_between');
    
            return $orders;
    }
    
    function get_orders_where_dates_between( $where ){
            global $wpdb;
            if( ! defined('GET_ORDERS_FILTER_DATE_FROM') || ! defined('PARCELWARE_GET_ORDERS_FILTER_DATE_TO') )
                return $where;
    
            $where .= $wpdb->prepare(" AND post_date >= '%s' ", GET_ORDERS_FILTER_DATE_FROM);
            $where .= $wpdb->prepare(" AND post_date <= '%s' ", GET_ORDERS_FILTER_DATE_TO);
    
            return $where;
    }
    
  • Antonio Gallo
    Antonio Gallo over 3 years
    I prefer your solution since wc_get_orders seems very buggy when searching for a date range (github tickets about it plus my direct bad experience).