WooCommerce 基于令牌的折扣在 Internet Explorer 上添加到购物车之前一直有效

问题描述 投票:0回答:1

我正在尝试在我的 WooCommerce 商店上实施基于令牌的折扣系统。它在大多数浏览器(Chrome、Firefox、Edge)上都能完美运行,但我在 Internet Explorer (IE) 上遇到问题。当令牌位于 URL 中时,折扣会正确应用,并且产品会在商店和产品页面上显示折扣价格。但是,一旦我将产品添加到购物车,它就会恢复正常价格。

我想要实现的目标:

  • 如果用户使用URL参数?token=AX4HN访问商店,我 设置一个 cookie 来存储折扣令牌一小时。

  • 当用户浏览时,基于代币的折扣应该持续存在 网站并将产品添加到购物车。

问题:

  • 在 Internet Explorer 上,首次使用时折扣会正确应用 使用令牌访问产品页面,但是当我单击“添加到购物车”时, 价格恢复正常价格。

  • 此问题仅发生在 Internet Explorer 中。其他浏览器 按预期工作。

第 2 步:如果 URL 中存在令牌,则设置 cookie

function set_token_cookie() {
    if (isset($_GET['token']) && $_GET['token'] === 'AX4HN') {
        setcookie('discount_token', 'AX4HN', time() + 3600, '/'); Cookie lasts for 1 hour
        $_COOKIE['discount_token'] = 'AX4HN'; // Set it immediately for current request
    }
}
add_action('init', 'set_token_cookie');

第三步:检查token是否有效

function has_valid_token() {
    return (isset($_GET['token']) && $_GET['token'] === 'AX4HN') || 
           (isset($_COOKIE['discount_token']) && $_COOKIE['discount_token'] === 'AX4HN');
}

如果令牌有效,可享受折扣

add_filter('woocommerce_product_get_price', 'custom_price_discount', 20, 2);
function custom_price_discount($price, $product) {
    $discount_rate = 0.8; // 20% discount
    if (has_valid_token() && !$product->is_on_sale()) {
        return floatval($price) * $discount_rate;
    }
    return $price;
}

观察结果:

  • 折扣价格正确显示在 IE 中的产品页面上。

  • 一旦我点击“添加到购物车”,购物车页面就会显示正常价格
    而不是折扣价。

  • Internet Explorer 似乎没有正确读取 cookie 离开初始页面后。

问题: 即使将产品添加到购物车后,如何确保 Internet Explorer 中的折扣保持一致?是否有更好的方法来处理与 Internet Explorer 兼容的网站上基于令牌的折扣?

任何有关如何解决此问题的帮助将不胜感激!

php wordpress woocommerce
1个回答
0
投票

您最好使用 WC Session 变量来实现此目的,而不是反复无常的 cookie,例如:

add_action( 'woocommerce_init', 'manage_wc_session_token_discount' );
function manage_wc_session_token_discount(){ 
    if( is_admin() ) {
        return;
    }

    // Force enabling WC Session for unlogged users
    if ( isset(WC()->session) && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true ); 
    }

    // Set the token discount as a WC Session variable
    if ( ! WC()->session->__isset('discount_token') && isset($_GET['token']) && $_GET['token'] === 'AX4HN' ) {
        // Set current timestamp value + 1 hour (expiration time)
        WC()->session->set('discount_token', time() + HOUR_IN_SECONDS );
    } 
    // Remove the token discount after expiration time
    elseif ( WC()->session->__isset('discount_token') &&  WC()->session->get('discount_token') <= time() ) {
        WC()->session->__unset('discount_token');
    }
}

function has_valid_discount_token() {
    return ( isset($_GET['token']) && $_GET['token'] === 'AX4HN') || WC()->session->__isset('discount_token');
}

add_filter('woocommerce_product_get_price', 'custom_price_discount', 20, 2);
add_filter('woocommerce_product_variation_get_price', 'custom_price_discount', 20, 2);
function custom_price_discount($price, $product) {
    if ( has_valid_discount_token() && !$product->is_on_sale()) {
        return floatval($price) * 0.8; // 20% discount
    }
    return $price;
}

它应该更好地工作(未经测试)

© www.soinside.com 2019 - 2024. All rights reserved.