Abstract_WC_Order_Data_Store_CPT::delete_items_by_ids │ public │ WC 11.1.0

Delete selected order items by ID.

Custom order data stores that override this method opt in to deferred item deletion. The IDs are captured when items are removed and deleted during order save.

Method of the class: Abstract_WC_Order_Data_Store_CPT{}

No Hooks.

Returns

void. Nothing (null).

Usage

$Abstract_WC_Order_Data_Store_CPT = new Abstract_WC_Order_Data_Store_CPT();
$Abstract_WC_Order_Data_Store_CPT->delete_items_by_ids( $order, $ids );
$order(WC_Order) (required)
Order object.
$ids(int[]) (required)
Order item IDs to delete.

Changelog

Since 11.1.0 Introduced.

Abstract_WC_Order_Data_Store_CPT::delete_items_by_ids() code WC 11.1.2

public function delete_items_by_ids( $order, $ids ) {
	global $wpdb;

	if ( ! $order->get_id() || empty( $ids ) ) {
		return;
	}

	$sanitized_ids = array_values(
		array_unique(
			array_filter(
				array_map( 'intval', (array) $ids ),
				static fn( $id ) => $id > 0
			)
		)
	);
	if ( empty( $sanitized_ids ) ) {
		return;
	}

	$ids_placeholders = implode( ', ', array_fill( 0, count( $sanitized_ids ), '%d' ) );

	$result = $wpdb->query(
		$wpdb->prepare(
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare -- $ids_placeholders is generated above.
			"DELETE itemmeta FROM {$wpdb->prefix}woocommerce_order_itemmeta as itemmeta INNER JOIN {$wpdb->prefix}woocommerce_order_items as items WHERE itemmeta.order_item_id = items.order_item_id AND items.order_id = %d AND items.order_item_id IN ($ids_placeholders)",
			array_merge( array( $order->get_id() ), $sanitized_ids )
		)
	);
	if ( false === $result ) {
		wc_get_logger()->error(
			'Failed to delete order item metadata.',
			array(
				'source'   => 'order-data-store',
				'order_id' => $order->get_id(),
				'error'    => $wpdb->last_error,
			)
		);
		throw new Exception( esc_html__( 'Unable to delete order item metadata.', 'woocommerce' ) );
	}
	$result = $wpdb->query(
		$wpdb->prepare(
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare -- $ids_placeholders is generated above.
			"DELETE FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = %d AND order_item_id IN ($ids_placeholders)",
			array_merge( array( $order->get_id() ), $sanitized_ids )
		)
	);
	if ( false === $result ) {
		wc_get_logger()->error(
			'Failed to delete order items.',
			array(
				'source'   => 'order-data-store',
				'order_id' => $order->get_id(),
				'error'    => $wpdb->last_error,
			)
		);
		throw new Exception( esc_html__( 'Unable to delete order items.', 'woocommerce' ) );
	}

	foreach ( $sanitized_ids as $item_id ) {
		wp_cache_delete( 'item-' . $item_id, 'order-items' );
	}

	$this->clear_caches( $order );
}