/**
* Breaks WooCommerce cart into multiple shipping packages (one package for each product).
*
* @see https://wpcodebook.com/split-woocommerce-cart-multiple-shipping-packages/
* @see https://github.com/woocommerce/woocommerce/blob/8.6.1/plugins/woocommerce/includes/class-wc-cart.php#L1506
* @see https://github.com/woocommerce/woocommerce/blob/8.6.1/plugins/woocommerce/includes/wc-cart-functions.php#L232
*/
add_filter( 'woocommerce_cart_shipping_packages', function ( $packages ) {
$initial_package = current( $packages );
$split_packages = array();
// Group packages by product ID
foreach ( $initial_package['contents'] as $cart_item_key => $cart_item ) {
$split_packages[ $cart_item['data']->get_id() ]['contents'][ $cart_item_key ] = $cart_item;
}
// Finalize packages: calculate cost and add data (destination, user, applied coupons)
foreach ( $split_packages as &$package ) {
$package['destination'] = $initial_package['destination'];
$package['user'] = $initial_package['user'];
$package['applied_coupons'] = $initial_package['applied_coupons'];
$package['contents_cost'] = array_sum( wp_list_pluck( $package['contents'], 'line_total' ) );
}
// Reset array keys (for package name display)
$split_packages = array_values( $split_packages );
return $split_packages;
} );