如何获取当前订单项的产品类别?

How to get product categories for the current order item?

提问人:Dave Lovely 提问时间:6/8/2019 最后编辑:Ghanshyam NakiyaDave Lovely 更新时间:6/18/2020 访问量:3540

问:

我正在尝试获取 woocommerce 订单项的产品类别woocommerce_checkout_create_order_line_item钩子。

我能够成功获取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() 有效是合乎逻辑的。但它返回一个 null 数组。

然后我在某处读到它已被弃用,我应该使用wc_get_product_category_list。所以我试了一下,也没有运气。

所以我现在被卡住了,无法弄清楚我的代码出了什么问题。感谢您的帮助。

php woocommerce 结帐 钩子-woocommerce

评论


答:

3赞 Yashar 6/14/2019 #1

正如您提到的,类的方法已弃用。相反,您可以使用方法。但是,此方法返回产品类别 ID,并且似乎您需要类别名称,以便我们可以从WP_Term对象中获取名称。get_categories()WC_Productget_category_ids()

最终代码如下所示:

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 );
}

注意:loop 是执行此类操作的首选方法(而不是使用循环)。foreachfor