3

当有付费订单时,我使用以下代码重新保存产品变体,但没有任何反应

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();
                }
            }
        }
    }
}

这个动作钩子有什么问题?请帮忙。

4

3 回答 3

3

钩子不是问题......主要问题if( $item->get_quantity() == 0 ){是总是false$item->get_quantity()需要用产品库存数量代替。尝试以下操作:

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
                }
            }
        }
    }
}

代码位于活动子主题(或活动主题)的 functions.php 文件中。它应该更好地工作。

于 2020-12-20T10:15:15.747 回答
3

由于钩子woocommerce_payment_complete似乎不起作用,请根据订单状态更改尝试以下操作(注意:此代码对于每个订单仅运行一次)

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' );
    }
}

代码位于活动子主题(或活动主题)的 functions.php 文件中。它可以更好地工作。

于 2020-12-23T18:38:43.403 回答
0

我发现了问题。我必须添加

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

$variation->save();
于 2020-12-26T06:57:46.900 回答