skip to Main Content

I created a custom product type for WooCommerce. With this product type it is possible to connect an other product that is exist by ID.

WooCommerce reduce the stock quantity automatically if an order is placed and the payment is successful.
For example I added a product with ID 4082 to the cart with a quantity from 3.
After place this order WooCommerce updated the stock from product 4082 with -3.

Ok back to my custom product type. As I said it is possible to connect another product by ID.
For example I connect product 4082 with product ID 10988.

If a customer add product 4082 to the cart and placed the order I want reduce the stock quantity from product ID 10988 and not from 4082.

<?php
add_action('woocommerce_checkout_order_processed', 'stocktest');

function stocktest($order_id){
    $order = wc_get_order( $order_id );
    $order_item = $order->get_items();
    foreach( $order_item as $product ) {
    //for the topic I programmed the IDs hardcoded 
        if($product->ID == '4082'){
            wc_update_product_stock( 10998, $product['qty'], 'decrease', '' );
        }
    }
}
?>

I tried the code above and the stock from ID 10998 is correctly decreased but also the stock from ID 4082 is decreased.

Do I use the wrong hook? And how can I make the function correctly?

Hope somebody can help me with this.

Thanks a lot

2

Answers


  1. Does wc_update_product_stock( 4082, $product['qty'], 'increase', '' ); not work?

    That way, the stock should be adjusted for the 4082 product.

    Also, there might be a potential issue with your snippet. The $product variable refers to the product object of 4082 product, not the 10998 product.

    Maybe try something like this?

    <?php
    add_action('woocommerce_checkout_order_processed', 'stocktest');
    
    function stocktest($order_id){
        $order = wc_get_order( $order_id );
        $order_item = $order->get_items();
        foreach( $order_item as $product ) {
        //for the topic I programmed the IDs hardcoded 
            if($product->ID == '4082'){
                $connected_qty = get_post_meta( 10988, '_stock', true );
                wc_update_product_stock( 10998, $connected_qty, 'decrease', '' );
                wc_update_product_stock( 4082, $product['qty'], 'increase', '' );
            }
        }
    }
    ?>
    

    Instead of using the custom field query, you could use the WC_Product class:

    $connected_product = wc_get_product(10998);
    $connected_qty = $connected_product->get_stock_quantity();
    
    Login or Signup to reply.
  2. I did some research on your question. WooCommerce called a lot of functions to update the stock af order / payment. If an order is placed the items become an status reduce_stock yes or no.
    If is yes go further and update the stock of this item. After this WooCommerce created the e-mails and ordernotes.

    All this functions worked together please be careful with changing the code in the file wc-stock-functions.php

    If you want change and try something do this for example on a local testserver.

    This are some functions in the file

    <?php
    wc_maybe_reduce_stock_levels();
    wc_maybe_increase_stock_levels();
    wc_reduce_stock_levels();
    wc_trigger_stock_change_notifications();
    ?>
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search