在WooCommerce中添加另一个购物车项目时删除一个特定的购物车项目

时间:2019-10-18 12:49:29

标签: woocommerce

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

我的策略是通过在购物车页面中添加如下链接来删除现有商品:

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

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

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

Remove a specific cart item when adding to cart a specific product in Woocommerce

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

Wordpress. Woocommerce. Action hook BEFORE adding to cart

我现在有以下代码:

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']为空。 因此,我得到通知“已删除”。 添加隐藏的表单字段也无济于事。

如何访问此变量? 谢谢!

1 个答案:

答案 0 :(得分:0)

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

我定义了会话变量:

$_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?