php - 如何获取当前订单项目的产品类别?
问题描述
我正在尝试在 woocommerce_checkout_create_order_line_item 挂钩处获取 woocommerce 订单项的产品类别。
我能够成功获得 product_id(感谢我到这里的帮助),但现在尝试获取产品的类别,数组返回空尝试 $product->get_categories() 或者尝试 wc_get_product_category_list($product->get_id()。
我无法弄清楚我做错了什么。
add_action('woocommerce_checkout_create_order_line_item',
'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
$product = $item->get_product(); // The WC_Product instance Object
$cat_names = $product->get_categories(); // one attempt
$cat_names = wc_get_product_category_list($product->get_id()); // another attempt
$arrlength = count($cat_names);
for($x = 0; $x<$arrlength; $x++) {
$cat_name = $cat_names[$x];
}
$item->update_meta_data( '_raw_product_id', $product->get_id() );
$item->update_meta_data( '_raw_product_name', $cat_name );
}
所以 add_action 和函数工作。“$product=...”有效,我可以在下面的第二行到最后一行代码中使用它作为 $product->get_id(),并且正确的值根据需要存储为元数据。
因此,由于 $product->get_id() 有效,我认为 $product->get_categories() 有效是合乎逻辑的。但它返回一个空数组。
然后我在某处读到它已被弃用,我应该使用 wc_get_product_category_list。所以我试过了,也没有运气。
所以我现在卡住了,无法弄清楚我的代码有什么问题。谢谢你的帮助。
解决方案
正如你提到get_categories()
的WC_Product
类方法已被弃用。相反,您可以使用get_category_ids()
方法。但是,此方法返回产品类别 ID,并且您似乎需要类别名称,以便我们可以从 WP_Term 对象中获取名称。
最终代码将是这样的:
add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta($item, $cart_item_key, $cart_item, $order)
{
$product = $item->get_product(); // The WC_Product instance Object
$cat_ids = $product->get_category_ids(); // returns an array of cat IDs
$cat_names = [];
foreach ( (array) $cat_ids as $cat_id) {
$cat_term = get_term_by('id', (int)$cat_id, 'product_cat');
if($cat_term){
$cat_names[] = $cat_term->name; // You may want to get slugs by $cat_term->slug
}
}
$item->update_meta_data( '_raw_product_id', $product->get_id() );
$item->update_meta_data( '_raw_product_name', $cat_names );
}
注意: foreach
循环是做这种事情的首选方式(而不是使用for
循环)。
推荐阅读
- php - 在 mySqli 中选择未正确返回排序且 PHP 未区分差异
- python - 在子列表的末尾添加一个数字?
- php - 提交表单后更改重定向
- java - 为什么 .write 不将整数添加到文件中?爪哇
- c# - 如何修复while循环崩溃程序
- amazon-cloudformation - AWS CloudFormation 函数调用失败:Fn::ImportValue 不得依赖于任何资源、导入的值或 Fn::GetAZs
- c++ - 朋友基础功能可以访问子数据
- asp.net - 如何在显示 MsgBox 之前向用户显示更新的 ASP.NET 页面?
- javascript - json对象中的for循环
- sql - 使用 SELECT 语句更新列