从 WooCommerce 中的 woocommerce_add_to_cart 操作挂钩获取产品 ID

问题描述 投票:0回答:1

我不明白如何将当前帖子的 ID 传递给钩子自定义函数。

代码中的场景是这样的:添加simple产品ID = 13后,其他两种产品(ID = 14和15)的库存水平会以编程方式减少。

此 ID 和数量是使用 SQL 查询从定制 SQL 表(不是元数据)中提取的。

此查询返回一个数组,其中元素数组[0 & 1][0]是ID,元素[1]是数量

数组(2) { [0]=> 数组(3) { [0]=> 字符串(2) "14" [1]=> 字符串(1) "5" [2]=> 字符串(1) "5" } [1]=> 数组(3) { [0]=> 字符串(2) "15" [1]=> 字符串(1) "2" [2]=> 字符串(1) "8" } }

代码

add_action( 'woocommerce_add_to_cart', 'wiz_stock_deduct', 10, 1 );


function wiz_stock_deduct( $product ) 
{
    // retrieve the parts in an array WP query
    $thispost_id = $product->ID;

    // retrieve parts and quantities
    $parts = wiz_checkpoststock ($thispost_id);

    if ($parts) 
    {
        for($i=0; $i < count($parts); $i++)
        {
            $part_id = $parts[$i][0];
            $part_quant = $parts[$i][1];
            // adjust quantity in stock
            //change_part_stock_ammounts ($part_id, $part_quant, 1);
            wc_update_product_stock($part_id, $part_quant, 'decrease', false);
        }       
    }   
}

手动添加此数组

$parts[]
到代码中是可行的。另外添加
$thispost_id = 13;
,有效。

我假设 SQL 搜索返回一个空数组。

如何获取添加到购物车的产品 ID?

php wordpress woocommerce product stock
1个回答
0
投票

您的代码中存在

woocommerce_add_to_cart
操作挂钩错误(位于第1287行)

do_action( 'woocommerce_add_to_cart', $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data );

如您所见,第一个钩子参数是

$cart_item_key
(但不是
WC_Product
对象)
。这就是您无法获取产品 ID 的原因。您可以直接从 $product_id (或 $variation_id 参数获取产品 ID。

尝试使用以下修改后的代码;

add_action( 'woocommerce_add_to_cart', 'wiz_stock_deduct', 10, 4 );
function wiz_stock_deduct( $cart_item_key, $product_id, $quantity, $variation_id ) {
    // Get the product ID:
    $_product_id = $variation_id > 0 ? $variation_id : $product_id;

    // Get related product data (ID and stock quantity)
    if ( $parts = wiz_checkpoststock( $_product_id ) ) 
    {
        for( $i = 0; $i < count($parts); $i++ )
        {
            if ( isset($parts[$i][0]) && isset($parts[$i][0]) ) 
            {
                // Adjust stock quantity of related products
                wc_update_product_stock( intval($parts[$i][0]), intval($parts[$i][0]), 'decrease', false);
            } 
        }       
    }   
}

代码位于子主题的functions.php 文件中(或插件中)。应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.