<?php defined('ABSPATH') || exit; class WC_Order_Factory { public static function get_order($order_id = false) { $order_id = self::get_order_id($order_id); if (!$order_id) { return false; } $order_type = WC_Data_Store::load('order')->get_order_type($order_id); $order_type_data = wc_get_order_type($order_type); if ($order_type_data) { $classname = $order_type_data['class_name']; } else { $classname = false; } $classname = apply_filters('woocommerce_order_class', $classname, $order_type, $order_id); if (!class_exists($classname)) { return false; } try { return new $classname($order_id); } catch (Exception $e) { wc_caught_exception($e, __FUNCTION__, array($order_id)); return false; } } public static function get_order_item($item_id = 0) { if (is_numeric($item_id)) { $item_type = WC_Data_Store::load('order-item')->get_order_item_type($item_id); $id = $item_id; } elseif ($item_id instanceof WC_Order_Item) { $item_type = $item_id->get_type(); $id = $item_id->get_id(); } elseif (is_object($item_id) && !empty($item_id->order_item_type)) { $id = $item_id->order_item_id; $item_type = $item_id->order_item_type; } else { $item_type = false; $id = false; } if ($id && $item_type) { $classname = false; switch ($item_type) { case 'line_item': case 'product': $classname = 'WC_Order_Item_Product'; break; case 'coupon': $classname = 'WC_Order_Item_Coupon'; break; case 'fee': $classname = 'WC_Order_Item_Fee'; break; case 'shipping': $classname = 'WC_Order_Item_Shipping'; break; case 'tax': $classname = 'WC_Order_Item_Tax'; break; } $classname = apply_filters('woocommerce_get_order_item_classname', $classname, $item_type, $id); if ($classname && class_exists($classname)) { try { return new $classname($id); } catch (Exception $e) { return false; } } } return false; } public static function get_order_id($order) { global $post; if (false === $order && is_a($post, 'WP_Post') && 'shop_order' === get_post_type($post)) { return absint($post->ID); } elseif (is_numeric($order)) { return $order; } elseif ($order instanceof WC_Abstract_Order) { return $order->get_id(); } elseif (!empty($order->ID)) { return $order->ID; } else { return false; } } }