php - WooCommerce 挂钩中的产品变体和父变量产品对象
问题描述
我为变化开发了一个自定义的交货时间信息。但由于某种原因,我无法获取变体的父产品 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
......您需要将其替换为:
// 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);
}
}
它应该工作得更好。
推荐阅读
- python - pandas groupby 多列给出了奇怪的索引行为
- c# - VSTO WPF 模式对话框光标在 TextBox 中不闪烁
- ios - 将 Sprite Kit 放入 UITabBarController
- vue.js - 构建 Vue.js 项目时出现未处理的拒绝错误
- node.js - 如何使用 Mongoose 和 MongoDB 进行分页
- c# - C# For 循环产生索引超出范围错误
- laravel - 基于其他表的雄辩 where 子句
- swift - 如何在 SwiftUI 中创建带有图像的按钮?
- java - 我需要解析整个 java 代码并将语句保存在树结构中以制作控制流图
- java - 预期 begin_array 但在第 1 行第 2 列路径 $ 改造处是 begin_object