skip to Main Content

I use following code to re save the product variations, when there is a paid order on it, but nothing happen

add_action('woocommerce_payment_complete', 'refresh_zero_stock');
function refresh_zero_stock($order_id){
    $order = new WC_Order( $order_id );
    foreach ($order->get_items() as $item_key => $item ){
        $item_quantity  = $item->get_quantity();
        if($item_quantity == 0){
            $product_id   = $item->get_product_id();
            $product_data = wc_get_product($product_id);
            if ($product_data->is_type('variable')){
                $handle = new WC_Product_Variable($product_id);
                $variations1=$handle->get_children();
                foreach ($variations1 as $value) {
                    $single_variation=new WC_Product_Variation($value);
                    $single_variation->save();
                }
            }
        }
    }
}

what is the problem with this action hook? please help.

3

Answers


  1. Chosen as BEST ANSWER

    I find the problem. I have to add

    $variation->set_manage_stock(false);
    $variation->set_stock_status('outofstock');
    

    before

    $variation->save();
    

  2. The hook is not the problem… The main problem is if( $item->get_quantity() == 0 ){ that is always false, where $item->get_quantity() need to be replaced with the product stock quantity instead. Try the following:

    add_action('woocommerce_payment_complete', 'refresh_zero_stock');
    function refresh_zero_stock( $order_id ){
        $order = wc_get_order( $order_id );
        
        foreach ($order->get_items() as $item ){
            $product = $item->get_product(); // Get the current product (object)
            
            // If stock quantity is 0 and if it's a product variation
            if ( $product->get_stock_quantity() == 0 && $product->is_type('variation') ){
                $parent_product = wc_get_product( $item->get_product_id() ); // Get parent variable product
                
                    // Loop through children Ids (variations ids) from the parent variable product
                    foreach ($parent_product->get_children() as $child_id ) {
                        $variation = wc_get_product( $child_id ); // Get the product variation from each child Id
                        $variation->save(); // refresh and save
                    }
                }
            }
        }
    }
    

    Code goes in functions.php file of the active child theme (or active theme). It should better works.

    Login or Signup to reply.
  3. As the hook woocommerce_payment_complete doesn’t seems to work, try the following instead based on order status change (Note: this code will run only once for each order):

    add_action( 'woocommerce_order_status_changed', 'refresh_zero_stock', 10, 4 );
    function refresh_zero_stock( $order_id, $from_status, $to_status, $order ){
        $variations_refreshed = $order->get_meta('_variations_refreshed');
    
        if( in_array($to_status, array('processing', 'completed') ) && ! $variations_refreshed ) {
            // Loop though order items
            foreach ($order->get_items() as $item ){
                $product = $item->get_product(); // Get the current product (object)
    
                // If stock quantity is 0 and if it's a product variation
                if ( $product->get_stock_quantity() == 0 && $product->is_type('variation') ){
                    $parent_product = wc_get_product( $item->get_product_id() ); // Get parent variable product
    
                        // Loop through children Ids (variations ids) from the parent variable product
                        foreach ($parent_product->get_children() as $child_id ) {
                            $variation = wc_get_product( $child_id ); // Get the product variation from each child Id
                            $variation->save(); // refresh and save
                        }
                    }
                }
            }
            // Flag the order to make this code run only once for current order
            $order->update_meta_data( '_variations_refreshed', '1' );
        }
    }
    

    Code goes in functions.php file of the active child theme (or active theme). It could better works.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search