我正在尝试在我的 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 兼容的网站上基于令牌的折扣?
任何有关如何解决此问题的帮助将不胜感激!
您最好使用 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;
}
它应该更好地工作(未经测试)。