add_action( 'woocommerce_reduce_order_stock', function( $order ) {
// The IDs below are the product IDs for the 2 products I used to test the snippet
// DO NOT FORGET to change them to the proper product IDs for your installation!!!
// ALWAYS ALWAYS ALWAYS test on a staging site first.
$pack_1_id = 1991;
$pack_6_id = 1990;
// Check if stock adjustment has already been run for this order to prevent recursion
if ( get_post_meta( $order->get_id(), '_stock_rebalanced', true ) ) {
return;
}
foreach ( $order->get_items() as $item ) {
$product_id = $item->get_product_id();
$qty_bought = $item->get_quantity();
if ( $product_id == $pack_6_id ) { // Directly reduce the 1-pack stock by 6 times the quantity of 6-packs sold.
$pack_1 = wc_get_product( $pack_1_id );
$pack_1_new_stock = $pack_1->get_stock_quantity() - ( $qty_bought * 6 );
wc_update_product_stock( $pack_1, $pack_1_new_stock, 'set' );
}
}
// Now, recalculate and adjust the stock for the 6-pack based on the remaining 1-pack stock.
$pack_1 = wc_get_product( $pack_1_id );
$current_pack_1_stock = $pack_1->get_stock_quantity();
$new_pack_6_stock = intdiv( $current_pack_1_stock, 6 );
$pack_6 = wc_get_product( $pack_6_id );
wc_update_product_stock( $pack_6, $new_pack_6_stock, 'set' );
update_post_meta( $order->get_id(), '_stock_rebalanced', 'yes' ); // Mark as stock rebalanced to prevent future recursion on this order
}, 10, 1 );
Comments