class-wc-order-factory.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. /**
  3. * Order Factory
  4. *
  5. * The WooCommerce order factory creating the right order objects.
  6. *
  7. * @version 3.0.0
  8. * @package WooCommerce/Classes
  9. */
  10. defined( 'ABSPATH' ) || exit;
  11. /**
  12. * Order factory class
  13. */
  14. class WC_Order_Factory {
  15. /**
  16. * Get order.
  17. *
  18. * @param mixed $order_id (default: false) Order ID to get.
  19. * @return WC_Order|bool
  20. */
  21. public static function get_order( $order_id = false ) {
  22. $order_id = self::get_order_id( $order_id );
  23. if ( ! $order_id ) {
  24. return false;
  25. }
  26. $order_type = WC_Data_Store::load( 'order' )->get_order_type( $order_id );
  27. $order_type_data = wc_get_order_type( $order_type );
  28. if ( $order_type_data ) {
  29. $classname = $order_type_data['class_name'];
  30. } else {
  31. $classname = false;
  32. }
  33. // Filter classname so that the class can be overridden if extended.
  34. $classname = apply_filters( 'woocommerce_order_class', $classname, $order_type, $order_id );
  35. if ( ! class_exists( $classname ) ) {
  36. return false;
  37. }
  38. try {
  39. return new $classname( $order_id );
  40. } catch ( Exception $e ) {
  41. wc_caught_exception( $e, __FUNCTION__, func_get_args() );
  42. return false;
  43. }
  44. }
  45. /**
  46. * Get order item.
  47. *
  48. * @param int $item_id Order item ID to get.
  49. * @return WC_Order_Item|false if not found
  50. */
  51. public static function get_order_item( $item_id = 0 ) {
  52. if ( is_numeric( $item_id ) ) {
  53. $item_type = WC_Data_Store::load( 'order-item' )->get_order_item_type( $item_id );
  54. $id = $item_id;
  55. } elseif ( $item_id instanceof WC_Order_Item ) {
  56. $item_type = $item_id->get_type();
  57. $id = $item_id->get_id();
  58. } elseif ( is_object( $item_id ) && ! empty( $item_id->order_item_type ) ) {
  59. $id = $item_id->order_item_id;
  60. $item_type = $item_id->order_item_type;
  61. } else {
  62. $item_type = false;
  63. $id = false;
  64. }
  65. if ( $id && $item_type ) {
  66. $classname = false;
  67. switch ( $item_type ) {
  68. case 'line_item':
  69. case 'product':
  70. $classname = 'WC_Order_Item_Product';
  71. break;
  72. case 'coupon':
  73. $classname = 'WC_Order_Item_Coupon';
  74. break;
  75. case 'fee':
  76. $classname = 'WC_Order_Item_Fee';
  77. break;
  78. case 'shipping':
  79. $classname = 'WC_Order_Item_Shipping';
  80. break;
  81. case 'tax':
  82. $classname = 'WC_Order_Item_Tax';
  83. break;
  84. }
  85. $classname = apply_filters( 'woocommerce_get_order_item_classname', $classname, $item_type, $id );
  86. if ( $classname && class_exists( $classname ) ) {
  87. try {
  88. return new $classname( $id );
  89. } catch ( Exception $e ) {
  90. return false;
  91. }
  92. }
  93. }
  94. return false;
  95. }
  96. /**
  97. * Get the order ID depending on what was passed.
  98. *
  99. * @since 3.0.0
  100. * @param mixed $order Order data to convert to an ID.
  101. * @return int|bool false on failure
  102. */
  103. public static function get_order_id( $order ) {
  104. global $post;
  105. if ( false === $order && is_a( $post, 'WP_Post' ) && 'shop_order' === get_post_type( $post ) ) {
  106. return absint( $post->ID );
  107. } elseif ( is_numeric( $order ) ) {
  108. return $order;
  109. } elseif ( $order instanceof WC_Abstract_Order ) {
  110. return $order->get_id();
  111. } elseif ( ! empty( $order->ID ) ) {
  112. return $order->ID;
  113. } else {
  114. return false;
  115. }
  116. }
  117. }