insert( $wpdb->prefix . 'woocommerce_order_items', array( 'order_item_name' => $item->get_name(), 'order_item_type' => $item->get_type(), 'order_id' => $item->get_order_id(), ) ); $item->set_id( $wpdb->insert_id ); $this->save_item_data( $item ); $item->save_meta_data(); $item->apply_changes(); $this->clear_cache( $item ); do_action( 'woocommerce_new_order_item', $item->get_id(), $item, $item->get_order_id() ); } /** * Update a order item in the database. * * @since 3.0.0 * @param WC_Order_Item $item Order item object. */ public function update( &$item ) { global $wpdb; $changes = $item->get_changes(); if ( array_intersect( array( 'name', 'order_id' ), array_keys( $changes ) ) ) { $wpdb->update( $wpdb->prefix . 'woocommerce_order_items', array( 'order_item_name' => $item->get_name(), 'order_item_type' => $item->get_type(), 'order_id' => $item->get_order_id(), ), array( 'order_item_id' => $item->get_id() ) ); } $this->save_item_data( $item ); $item->save_meta_data(); $item->apply_changes(); $this->clear_cache( $item ); do_action( 'woocommerce_update_order_item', $item->get_id(), $item, $item->get_order_id() ); } /** * Remove an order item from the database. * * @since 3.0.0 * @param WC_Order_Item $item Order item object. * @param array $args Array of args to pass to the delete method. */ public function delete( &$item, $args = array() ) { if ( $item->get_id() ) { global $wpdb; do_action( 'woocommerce_before_delete_order_item', $item->get_id() ); $wpdb->delete( $wpdb->prefix . 'woocommerce_order_items', array( 'order_item_id' => $item->get_id() ) ); $wpdb->delete( $wpdb->prefix . 'woocommerce_order_itemmeta', array( 'order_item_id' => $item->get_id() ) ); do_action( 'woocommerce_delete_order_item', $item->get_id() ); $this->clear_cache( $item ); } } /** * Read a order item from the database. * * @since 3.0.0 * * @param WC_Order_Item $item Order item object. * * @throws Exception If invalid order item. */ public function read( &$item ) { global $wpdb; $item->set_defaults(); // Get from cache if available. $data = wp_cache_get( 'item-' . $item->get_id(), 'order-items' ); if ( false === $data ) { $data = $wpdb->get_row( $wpdb->prepare( "SELECT order_id, order_item_name FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d LIMIT 1;", $item->get_id() ) ); wp_cache_set( 'item-' . $item->get_id(), $data, 'order-items' ); } if ( ! $data ) { throw new Exception( __( 'Invalid order item.', 'woocommerce' ) ); } $item->set_props( array( 'order_id' => $data->order_id, 'name' => $data->order_item_name, ) ); $item->read_meta_data(); } /** * Saves an item's data to the database / item meta. * Ran after both create and update, so $item->get_id() will be set. * * @since 3.0.0 * @param WC_Order_Item $item Order item object. */ public function save_item_data( &$item ) {} /** * Clear meta cache. * * @param WC_Order_Item $item Order item object. */ public function clear_cache( &$item ) { wp_cache_delete( 'item-' . $item->get_id(), 'order-items' ); wp_cache_delete( 'order-items-' . $item->get_order_id(), 'orders' ); wp_cache_delete( $item->get_id(), $this->meta_type . '_meta' ); } }