* WC Admin Order class that adds some functionality on top of general WooCommerce WC_Order.
namespace Automattic\WooCommerce\Admin\Overrides;
defined( 'ABSPATH' ) || exit;
use Automattic\WooCommerce\Admin\API\Reports\Customers\DataStore as CustomersDataStore;
use Automattic\WooCommerce\Admin\API\Reports\Orders\Stats\DataStore as OrdersStatsDataStore;
class Order extends \WC_Order {
* Holds refund amounts and quantities for the order.
protected $refunded_line_items;
* Caches the customer ID.
public $customer_id = null;
* Get only core class data in array format.
public function get_data_without_line_items() {
'number' => $this->get_order_number(),
'meta_data' => $this->get_meta_data(),
* Get order line item data by type.
* @param string $type Order line item type.
* @return array|bool Array of line items on success, boolean false on failure.
public function get_line_item_data( $type ) {
'line_items' => 'line_item',
'shipping_lines' => 'shipping',
'coupon_lines' => 'coupon',
if ( isset( $type_to_items[ $type ] ) ) {
return $this->get_items( $type_to_items[ $type ] );
* Add filter(s) required to hook this class to substitute WC_Order.
public static function add_filters() {
add_filter( 'woocommerce_order_class', array( __CLASS__, 'order_class_name' ), 10, 3 );
* Filter function to swap class WC_Order for this one in cases when it's suitable.
* @param string $classname Name of the class to be created.
* @param string $order_type Type of order object to be created.
* @param number $order_id Order id to create.
public static function order_class_name( $classname, $order_type, $order_id ) {
// @todo - Only substitute class when necessary (during sync).
if ( 'WC_Order' === $classname ) {
return '\Automattic\WooCommerce\Admin\Overrides\Order';
* Get the customer ID used for reports in the customer lookup table.
public function get_report_customer_id() {
if ( is_null( $this->customer_id ) ) {
$this->customer_id = CustomersDataStore::get_or_create_customer_from_order( $this );
return $this->customer_id;
* Returns true if the customer has made an earlier order.
public function is_returning_customer() {
return OrdersStatsDataStore::is_returning_customer( $this, $this->get_report_customer_id() );
* Get the customer's first name.
public function get_customer_first_name() {
if ( $this->get_user_id() ) {
return get_user_meta( $this->get_user_id(), 'first_name', true );
if ( '' !== $this->get_billing_first_name( 'edit' ) ) {
return $this->get_billing_first_name( 'edit' );
return $this->get_shipping_first_name( 'edit' );
* Get the customer's last name.
public function get_customer_last_name() {
if ( $this->get_user_id() ) {
return get_user_meta( $this->get_user_id(), 'last_name', true );
if ( '' !== $this->get_billing_last_name( 'edit' ) ) {
return $this->get_billing_last_name( 'edit' );
return $this->get_shipping_last_name( 'edit' );