Php 钩子中的产品变量和父变量产品对象

Php 钩子中的产品变量和父变量产品对象,php,wordpress,woocommerce,product,product-variations,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

我开发了一个定制的交付时间信息的变化。但由于某些原因,我无法获取变体的父产品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\u available\u variation
…您需要将其替换为:

//这里我正在为每个变体加载特殊信息
添加过滤器('woocommerce\u available\u variation'、'load\u variation\u products\u fields',10,3);
函数加载\变量\产品\字段($variation\数据,$product,$variation){
$variation_data['variation_cmpzDeliveryTime']=get_delivery_time($variation_data,$product,$variation);
返回$U数据;
}
现在您可以看到有3个参数,
$product
是父变量product对象,
$variation
是产品变量对象

因此,您将进行更改,您还必须更改
get\u delivery\u time()
函数代码,例如:

函数获取交付时间($variation\u data、$product、$variation){
$variation_id=$variations['variation_id'];//或$variation->get_id();
$is_in_stock=$variation['is_in_stock'];//is variation“in stock”
$parent_product_id=$product->get_id();//父变量product id
//var\u dump($parent\u product\u id);
如果(Helpers::get_product_multi_inventory_status($variation_id)==“no”){
如果(wc_gzd_get_product($variation_id)->get_delivery_time_html()=''”{
如果($有库存){
返回集合\交付\文本('instock',$parent\产品\标识);
}否则{
返回集合_交付_文本('out of stock');
}
}
}否则{
返回获取、交付、时间、多存货($variation\u id);
}
}

它应该工作得更好。

好的,你的代码比我的代码工作得更好,谢谢。因此,在woocommerce_available_variation hook中显然不可能访问$post?@m3rlin是的,您可以尝试使用
global$post访问它
或使用
$post=get_post($product->get_id())确定…您将获得父变量product WP\u Post对象。我很好奇,你为什么需要post对象?只是问。。。我浪费了太多时间试图找出它为什么不起作用,所以我想知道:)但你的解决方案是better@m3rlin使用钩子时,请始终检查钩子函数中有哪些参数可用,这样您将损失更少的时间: