我正在尝试通过代码从购物车中删除特定产品。我只看到空车选项,它清除了购物车中的所有产品,但我想在购物车页面中清除特定产品。 例如: 假设我已经添加了两个产品到购物车,但我想购物车行为应该既不是也不意味着只有一个产品应该在购物车中。 如果产品1在购物车中,则产品2不应允许添加到购物车中。如果产品2在购物车中,那么产品1不应该允许。
我尝试了很少的代码但我无法找到完成此实际行为的钩子。我正在尝试的是而不是空的整个购物车,我加载购物车内容,这是使用购物车项目键取消特定数组的值数组,并将剩余的内容加载到购物车。但看起来不适合我。
function cf_alter_cart_content($value) {
global $woocommerce;
$cart_contents = $woocommerce->cart->get_cart();
foreach ($woocommerce->cart->get_cart() as $cart_item_key => $value) {
if ($value['product_id'] == '77') {
unset($cart_contents[$cart_item_key]);
unset($value['data']);
}
return $value['data'];
}
}
//add_action('wp_head', 'cf_alter_cart_content');
add_filter('woocommerce_cart_item_product', 'cf_alter_cart_content', 10, 1);
可能有任何简单的方法来实现这一目标吗?不确定任何建议会很棒。
答案 0 :(得分:1)
我正在使用woocommerce_before_cart
过滤器进行类似设置,其中某些群组中的人员不允许订购特定产品skus。我希望这有帮助。您可能希望在每个产品中创建一个自定义字段,类似于逗号描述的其他skus / post_id列表,不允许与其一起订购。
此代码检查用户所关联的第一个组(在我的站点中,他们只有1个组)。 disallowed_product_skus是不允许用户购买该组的skus列表。
$disallowed_product_skus = array (
<group_num> => array (
'<sku>',
)
);
add_filter ( 'woocommerce_before_cart' , 'cart_check_disallowed_skus' );
function cart_check_disallowed_skus() {
global $woocommerce;
global $disallowed_product_skus;
$assigned_group = GroupOperations::get_current_user_first_group();
$cart_contents = $woocommerce->cart->get_cart();
$keys = array_keys ( $cart_contents );
if ( array_key_exists ( $assigned_group , $disallowed_product_skus ) ) {
$disallowed_products_in_cart = false;
foreach ( $keys as $key ) {
$cart_item_product_id = $cart_contents[$key]['product_id'];
$cart_product_meta = get_post_meta ( $cart_item_product_id );
$cart_product_sku = $cart_product_meta['_sku'][0];
if ( in_array ( $cart_product_sku , $disallowed_product_skus[$assigned_group] ) ) {
$woocommerce->cart->set_quantity ( $key , 0 , true );
$disallowed_products_in_cart = true;
}
}
if ( $disallowed_products_in_cart ) {
echo '<p class="woocommerce-error">Non-approved products have been automatically removed from cart.</p>';
}
}
}