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);
Related videos on Youtube
Author by
A.Verta
Updated on June 04, 2022Comments
-
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 over 3 yearsI 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).