php - WooCommerce Hook 中的产品变体和父变量产品对象

标签 php wordpress woocommerce product product-variations

我为变体开发了自定义交货时间信息。但由于某种原因,我无法获取变体的父产品 ID 以在我的函数中使用它。我尝试了以下方法 - 如果我将 $id 直接设置为 51237,我的代码可以工作,但是使用 $post 来获取 id 则不行。 任何帮助表示赞赏!

// here I am loading special infos for each variation

add_filter( 'woocommerce_available_variation', 'load_variation_products_fields', 1 );
function load_variation_products_fields( $variations ) {
    $variations['variation_cmpzDeliveryTime'] = get_delivery_time( $variations[ 'variation_id' ] ) ;
    return $variations;
}


function get_delivery_time ( $product_id) {
    $product_obj = wc_get_product( $product_id );
    

    // here I want the post ID (so the parent product ID if the product type is variation)
    global $post;
    $id = $post->ID; 

    var_dump ($id); // this outputs "int(51237)" for each variation - that seems to be right!

    switch($product_obj->get_type())    {
        case 'variation':
            if (Helpers::get_product_multi_inventory_status($product_id) == 'no' ) {
                $_pf = new WC_Product_Factory(); 
                $_product = $_pf->get_product($product_id);
                $stock_status = $_product->get_stock_status();
                if ( wc_gzd_get_product( $product_id )->get_delivery_time_html() == '' )    { 
                    if ( ($stock_status == 'instock')   )   {
                        // $id is ignored - if I put here 51237, it works!
                        return set_delivery_text('instock', $id); 
                    } else  {
                        return set_delivery_text('outofstock');
                    }
                }
            }
            elseif (Helpers::get_product_multi_inventory_status($product_id) == 'yes' ) {
                return get_delivery_time_multi_inventory($product_id);
            }
            break;
    }
}

最佳答案

woocommerce_available_variation 中 Hook 的函数中缺少一些参数...您需要将其替换为:

// here I am loading special infos for each variation
add_filter( 'woocommerce_available_variation', 'load_variation_products_fields', 10, 3 );
function load_variation_products_fields( $variation_data, $product, $variation ) {
    $variation_data['variation_cmpzDeliveryTime'] = get_delivery_time( $variation_data, $product, $variation ) ;
    return $variation_data;
}

现在您可以看到有 3 个参数,其中 $product 是父变量产品对象,$variation 是产品变体对象。

因此,您将更改您还必须更改 get_delivery_time() 函数代码,例如:

function get_delivery_time ( $variation_data, $product, $variation ) {
    $variation_id      = $variations['variation_id']; // or $variation->get_id();
    $is_in_stock       = $variation['is_in_stock']; // is variation "in stock"
    $parent_product_id = $product->get_id(); // The parent variable product Id
    // var_dump($parent_product_id);

    if ( Helpers::get_product_multi_inventory_status($variation_id) == 'no' ) { 
        if ( wc_gzd_get_product( $variation_id )->get_delivery_time_html() == '' )    { 
            if ( $is_in_stock ) {
                return set_delivery_text('instock', $parent_product_id); 
            } else  {
                return set_delivery_text('outofstock');
            }
        }
    } else {
        return get_delivery_time_multi_inventory($variation_id);
    }
}

它应该工作得更好。

关于php - WooCommerce Hook 中的产品变体和父变量产品对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64332460/

相关文章:

css - 在移动设备上隐藏图像

wordpress - 如何使复选框默认选中?在 Woocommerce 结帐中

php - 在 WooCommerce 3 中将自定义列添加到管理产品列表

php - 在 Woocommerce 中的 functions.php 文件中显示添加到购物车按钮的价格

javascript - onclick 为 mysql ( wordpress ) 前端添加值

PHP openssl_sign 停止执行所有脚本

php - 将 Jquery 文件上传连接到我的 MySQL 数据库

php - 洪水功能,显示可以再次发帖的时间

PHP stream_context_create 和 HTTP header - 数组或字符串,\r\n 最后,Content-Length 可选?

html - Wordpress Metabox 输入表单溢出