【问题标题】:Function that retrieves the stock quantity from a product in WooCommerce从 WooCommerce 中的产品中检索库存数量的函数
【发布时间】:2019-07-10 20:03:14
【问题描述】:

我正在尝试创建一个从 WooCommerce 中的产品中检索库存数量的函数。 如果我注释掉以下行代码运行,但如果我把它留在我得到一个白屏: $product = is_a($product, 'WC_Product') ? $product : wc_get_product($product_id);

有什么想法我在这里做错了吗?

function wc_get_variable_product_stock_quantity( $output = 'raw', $product_id = 0 ){
    global $wpdb, $product;

    // Get the product ID (can be defined)
    $product_id = $product_id > 0 ? $product_id : get_the_id();

    // Check and get the instance of the WC_Product Object
    $product = is_a( $product, 'WC_Product' ) ? $product : wc_get_product($product_id);
    $stock_quantity = $product->get_stock_quantity();

    return $stock_quantity;

}

编辑(更新):

我的最终目标是在订单状态更改完成后汇总所有变体的库存数量,然后将总数写入父产品的库存数量,以便总库存数量始终是最新的。

我上面的过度简化示例实际上应该类似于下面的代码,主要基于“Get the total stock of all variations from a variable product In Woocommerce”答案代码,略有变化(请参阅附加 SQL 语句)

    function wc_get_variable_product_stock_quantity( $output = 'raw', $product_id = 0 ){
        global $wpdb, $product;

        // Get the product ID (can be defined)
        $product_id = $product_id > 0 ? $product_id : get_the_id();

        // Check and get the instance of the WC_Product Object
        $product = is_a( $product, 'WC_Product' ) ? $product : wc_get_product($product_id);
        // Get the stock quantity sum of all product variations (children)
        $stock_quantity = $wpdb->get_var("
            SELECT SUM(pm.meta_value)
            FROM {$wpdb->prefix}posts as p
            JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product_variation'
            AND p.post_status = 'publish'
            AND p.post_parent = '$product_id'
            AND pm.meta_key = '_stock'
            AND pm.meta_value IS NOT NULL
        ");   
        return $stock_quantity;
    }


// Update stock totals for parent product when order status changes to completed...
function mysite_woocommerce_order_status_completed( $order_id ) {

    // For each item in the order, calculate the total stock quantity for all variations and write the total to the parent products's stock quantity
    $order = wc_get_order( $order_id );
    $order_id = $order->get_id();

    $log_txt = '';
    $items = $order->get_items();
    foreach($items as $k=>$val){     
        $product_id = $val[‘product_id’];
        $total_stock_quantity = wc_get_variable_product_stock_quantity( 'raw', $product_id );
        $log_txt .= 'Product ID:'.$val['product_id'].', Name: '.$val['name'].', Total Stock: '.$total_stock_quantity.'\n<br>';
        // Next: add code to write the stock total to the parent product
    }
}

add_action( 'woocommerce_order_status_completed', 'mysite_woocommerce_order_status_completed', 10, 1 );

【问题讨论】:

    标签: php wordpress woocommerce product product-quantity


    【解决方案1】:

    你说你想创建一个函数来从 WooCommerce 中的产品中检索库存数量,那么为什么你不直接使用其中之一

    • 使用产品对象实例使用WC_Product方法get_stock_quantity()
    • 或使用产品 ID 使用 get_post_meta( $product_id, '_stock', true )

    现在,根据“Get the total stock of all variations from a variable product In Woocommerce”的回答,您的代码有一些不需要的东西,并且可以以更轻便、更紧凑和更有效的方式制作不同的东西:

    function wc_get_variable_product_stock_quantity( $product_id = 0 ){
        // Get the product ID (can be defined)
        $product_id = $product_id > 0 ? $product_id : get_the_ID();
    
        return get_post_meta( $product_id, '_stock', true );
    }
    

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

    或者你可以直接使用:

    get_post_meta( $product_id, '_stock', true );
    

    get_post_meta( get_the_ID(), '_stock', true );
    

    【讨论】:

    • 因为我试图让我的代码示例保持简单。很抱歉混淆了事情。我更新了我的问题以包含一条 SQL 语句以使其更清晰。在添加下一段代码之前,我试图弄清楚为什么会出现白屏。感谢您的帮助。
    • @eCommercePhil 您的代码基于my linked answer code (有效)...您的问题来自您对它的使用,而不是代码本身 (应该可以)。因此,您需要提供更多背景信息,以便我们为您提供帮助,因为它不可测试。请记住“寻求调试帮助的问题必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码
    • @eCommercePhil ...“没有明确的问题陈述(在定义的上下文中)的问题对其他读者没有用处”。
    • 好点,谢谢。我添加了调用函数,所以有上下文。希望这对其他人也有用。还要感谢您的出色示例,我以此为基础。 :-)
    猜你喜欢
    • 2017-04-17
    • 2021-06-09
    • 2018-05-25
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多