按属性值减少 WooCommerce 项目库存

Reduce WooCommerce Item Inventory By Attribute Value

我有一个 Woocommerce "Variable Products" 设置,其中唯一的变化是 'size' 属性:15 克、100 克、250 克。我想要做的是使用该变化量传递给 Woo wc-stock-functions,这样当购买产品变化“15 克”时,总库存下降 15,而不是 1。

在 Woo 中,有文件 wc-stock-functions (http://hookr.io/plugins/woocommerce/3.0.6/files/includes-wc-stock-functions/) - 这甚至提供了一个过滤器,woocommerce_order_item_quantity。我想用它来将库存数量乘以克数,并通过这种方式减少库存克数。

我正在尝试这个:

// define the woocommerce_order_item_quantity callback 
function filter_woocommerce_order_item_quantity( $item_get_quantity, $order, 
$item ) { 
$original_quantity = $item_get_quantity; 
$item_quantity_grams = $item->get_attribute('pa_size');
// attribute value is "15 grams" - so remove all but the numerals
$item_quantity_grams = preg_replace('/[^0-9.]+/', '', $item_quantity_grams);
// multiply for new quantity
$item_get_quantity = ($item_quantity_grams * $original_quantity);

return $item_get_quantity; 
}; 

// add the filter 
add_filter( 'woocommerce_order_item_quantity', 
'filter_woocommerce_order_item_quantity', 10, 3 ); 

但我现在收到内部服务器错误作为响应。

有谁知道我在上面的代码中做错了什么?感谢您的帮助。

第一个错误在 $item->get_attribute('pa_size'); 中,因为 $itemWC_Order_Item_Product 对象的一个​​实例,并且 WC_Order_Item_Product [=29] 不存在 get_attribute() 方法=].

相反,您需要使用 get_product() 方法从 WC_Order_Item_Product Class…

获取 WC_Product 对象的实例

所以你的代码应该是:

add_filter( 'woocommerce_order_item_quantity', 'filter_order_item_quantity', 10, 3 ); 
function filter_order_item_quantity( $quantity, $order, $item )  
{
    $product   = $item->get_product();
    $term_name = $product->get_attribute('pa_size');

    // The 'pa_size' attribute value is "15 grams" And we keep only the numbers
    $quantity_grams = preg_replace('/[^0-9.]+/', '', $term_name);

    // Calculated new quantity
    if( is_numeric ( $quantity_grams ) && $quantity_grams != 0 )
        $quantity *= $quantity_grams;

    return $quantity;
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。

Note: This hooked function is going to reduce the stock quantity based on that new returned increased quantity value (in this case the real quantity multiplied by 15)