我正在编写的功能应该检查购物车中是否有一个具有特定类别的商品。
我的想法是:
add_filter( 'woocommerce_package_rates', 'remove_flat_rate_from_used_products', 10, 2 );
function remove_flat_rate_from_used_products($rates, $package) {
if( is_woocommerce() && ( is_checkout() || is_cart() ) ) {
if( check_whether_item_has_the_category() ) {
unset( $rates['flat_rate'] );
}
}
return $rates;
}
我猜,get_cart()函数返回购物车的内容,我可以获得有关商品类别的信息。我需要知道数组get_cart()返回的结构,所以我写道:
function check_whether_item_has_the_category() {
global $woocommerce;
var_dump(WC()->cart->get_cart());
}
得到了
Warning: Invalid argument supplied for foreach() in ...wp-content\plugins\woocommerce\includes\class-wc-shipping.php on line 295
然后我尝试在get_cart()函数的结果中找到类别名称:
function check_whether_item_has_the_category() {
global $woocommerce;
if( in_array('used', WC()->cart->get_cart()) ) {
echo 'do something';
}
}
并得到了同样的错误。
使用$ woocommerce而不是WC()什么都没有,以及删除global $woocommerce
我做错了什么?如何获取项目类别(或检查它们是否存在特定的项目)?
答案 0 :(得分:1)
变量$package
还包含购物车内容($package['contents']
),这是一个包含购物车中所有商品的数组。
因此,您可以循环查看单个产品是否具有所需的类别。要获取类别,您可以使用wp_get_post_terms()
:
function remove_flat_rate_from_used_products($rates, $package) {
// for each product in cart...
foreach ($package['contents'] as $product) {
// get product categories
$product_cats = wp_get_post_terms( $product['product_id'], 'product_cat', array('fields' => 'names') );
// if it has category_name unset flat rate
if( in_array('category_name', $product_cats) ) {
unset( $rates['flat_rate'] );
break;
}
}
return $rates;
}