首页 > 解决方案 > 在 WooCommerce 中添加另一个时删除一个特定的购物车项目

问题描述

我正在尝试实现一个功能,以便能够使用自定义属性更新购物车项目(显示在产品视图的输入字段中)。

我的策略是通过在购物车页面中添加一个链接来删除现有项目,如下所示:

/product/my-product/?edit_item=7326b7ed789bc9ae1ddfe97fd0abcf72(密钥)

然后,一旦用户单击“添加到购物车”,我想删除该产品。

我在这里尝试过这个解决方案(第一个答案):

在 Woocommerce 中将特定产品添加到购物车时删除特定购物车项目

而这个(也是第一个答案):

WordPress。电子商务。添加到购物车之前的操作挂钩

我现在有这个代码:

function so_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {
GLOBAL $woocommerce;
$keytoremove=$_GET['edit_item'];

    // do your validation, if not met switch $passed to false
    if ( 1 != 2 ){
        $passed = true;
        // $woocommerce->cart->remove_cart_item($keytoremove);      
        wc_add_notice( __( $keytoremove. ' was removed', 'textdomain' ), 'notice' );
    }
    return $passed;

}
add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 10, 5 );

问题是我无法访问变量... $_GET['edit_item'] 是空的。所以我收到通知“已删除”。添加隐藏的表单域也无济于事。

我怎样才能访问这个变量?谢谢!

标签: woocommerce

解决方案


我现在已将要删除的产品的密钥存储在会话中,并在删除后将其删除。看起来像这样:

我已经定义了会话变量:

$_SESSION['keytoremove'] = $_GET['edit_item'];

后来我的功能执行以下操作:

function so_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {

GLOBAL $woocommerce;

if ( isset ($_SESSION['keytoremove']) ) {
    $keytoremove=$_SESSION['keytoremove'];
    $passed = true;
    $woocommerce->cart->remove_cart_item($keytoremove);
    wc_add_notice( __( $keytoremove. ' was removed from the cart', 'textdomain' ), 'notice' );
    unset ($_SESSION["keytoremove"]);
    }
return $passed;
}

add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 10, 5 );

测试和工作。也许有更好的解决方案避免使用 $_SESSION-Vars?


推荐阅读