WC_Abstract_Order::add_product()
Add a product line item to the order. This is the only line item type with its own method because it saves looking up order amounts (costs are added up for you).
Method of the class: WC_Abstract_Order{}
No Hooks.
Return
Int
.
Usage
$WC_Abstract_Order = new WC_Abstract_Order(); $WC_Abstract_Order->add_product( $product, $qty, $args );
- $product(WC_Product) (required)
- Product object.
- $qty(int)
- Quantity to add.
Default: 1 - $args(array)
- Args for the added product.
Default: array()
WC_Abstract_Order::add_product() WC Abstract Order::add product code WC 8.6.1
public function add_product( $product, $qty = 1, $args = array() ) { if ( $product ) { $order = ArrayUtil::get_value_or_default( $args, 'order' ); $total = wc_get_price_excluding_tax( $product, array( 'qty' => $qty, 'order' => $order, ) ); $default_args = array( 'name' => $product->get_name(), 'tax_class' => $product->get_tax_class(), 'product_id' => $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id(), 'variation_id' => $product->is_type( 'variation' ) ? $product->get_id() : 0, 'variation' => $product->is_type( 'variation' ) ? $product->get_attributes() : array(), 'subtotal' => $total, 'total' => $total, 'quantity' => $qty, ); } else { $default_args = array( 'quantity' => $qty, ); } $args = wp_parse_args( $args, $default_args ); // BW compatibility with old args. if ( isset( $args['totals'] ) ) { foreach ( $args['totals'] as $key => $value ) { if ( 'tax' === $key ) { $args['total_tax'] = $value; } elseif ( 'tax_data' === $key ) { $args['taxes'] = $value; } else { $args[ $key ] = $value; } } } $item = wc_get_container()->get( LegacyProxy::class )->get_instance_of( WC_Order_Item_Product::class ); $item->set_props( $args ); $item->set_backorder_meta(); $item->set_order_id( $this->get_id() ); $item->save(); $this->add_item( $item ); wc_do_deprecated_action( 'woocommerce_order_add_product', array( $this->get_id(), $item->get_id(), $product, $qty, $args ), '3.0', 'woocommerce_new_order_item action instead' ); delete_transient( 'wc_order_' . $this->get_id() . '_needs_processing' ); return $item->get_id(); }