即使购物车在 WooCommerce 中为空,也可以通过 URL 中的 GET 方法应用优惠券折扣
Posted
技术标签:
【中文标题】即使购物车在 WooCommerce 中为空,也可以通过 URL 中的 GET 方法应用优惠券折扣【英文标题】:Apply coupon discount via GET method in URL even if cart is empty in WooCommerce 【发布时间】:2018-03-30 13:36:11 【问题描述】:我有一个插件,可以将倡导者推荐优惠券代码发送到他们输入的电子邮件中。当观众收到这封电子邮件时,我想创建一个流程,他们可以点击电子邮件中的“立即购买”,然后将自动添加优惠券。
到目前为止,对于“立即购买”按钮下的链接,我输入了以下内容:
websitename.biz/cart__trashed?code=DISCOUNTCODE
为了处理$code
,我把它放在了我的functions.php文件中:
add_action('woocommerce_before_cart', 'discount');
function discount( )
global $woocommerce;
$code= $_GET["code"];
if(!empty($code))
if($woocommerce->cart->add_discount($code))
echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';
我在这里面临的问题是:
如果观众访问网站时购物车中没有任何东西,则不会使用优惠券。 如果添加了一些东西并留在那里(因为 cookie),那么优惠券代码将完美应用。我相信是因为购物车是空的,所以代码不起作用。
只希望在观众点击链接时应用代码。
我怎样才能使它工作?
【问题讨论】:
您可以将产品 ID 与优惠券代码一起传递,以便在任何客户点击链接时,首先检查该产品是否存在于购物车中。如果没有,请先通过您的代码将产品添加到购物车,然后最后应用优惠券。 当我只有 3 件产品时,我认为这是一种解决方法,但我只需将优惠券代码添加到购物车,他们就可以购买任何他们想要的东西和代码将应用于会话?当然,这对客户来说更容易 但是 Woocommerce 不允许在购物车为空时应用优惠券并将其保存到购物车。但是您可以编写自定义代码,就像客户单击链接时将优惠券代码保存在您自己的会话密钥上一样,从那里您可以跟踪客户是否在购物车中有任何东西。如果是,则通过从您的会话密钥中获取来应用优惠券。 所以我会使用 WC-Cart::set_session($code)? 有多种设置会话的方法,您可以尝试其中任何一个选项并开始工作 【参考方案1】:add_action('woocommerce_before_cart', 'discount');
function discount( )
global $woocommerce;
$code= $_GET["code"];
if(!empty($code))
if(WC()->session->set( 'applied_coupons', $code ))
echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';
【讨论】:
嘿,这不起作用,当我添加产品时,它不会回显已应用的优惠券,添加产品或结帐时也不会应用优惠券。【参考方案2】:使用下面的代码使优惠券在任何情况下都有效
add_filter('woocommerce_coupon_is_valid','coupon_always_valid',10,1);
function coupon_always_valid($valid)
$valid = true;
return $valid ;
【讨论】:
这将实现什么?我应该把它和我写的代码一起附加到我的functions.php吗?【参考方案3】:正确的做法应该是:
将购物车会话中 URL 中的优惠券代码设置为自定义数据。 当客户将第一件商品添加到购物车时,应用此优惠券代码的折扣。 如果客户的购物车是空的,则从此优惠券中删除折扣您可以从任何 URL 设置任何现有的优惠券代码(例如商店页面、其他档案页面、产品页面、我的帐户页面或任何现有页面)添加到此现有 URL:
?code=DISCOUNTCODE
at结尾 (DISCOUNTCODE
是您的优惠券代码名称)。
代码如下:
// Set coupon code as custom data in cart session
add_action('wp_loaded', 'add_coupon_code_to_cart_session');
function add_coupon_code_to_cart_session()
// Exit if no code in URL or if the coupon code is already set cart session
if( empty( $_GET["code"] ) || WC()->session->get( 'custom_discount' ) ) return;
if( ! WC()->session->get( 'custom_discount' ) )
$coupon_code = esc_attr($_GET["code"]);
WC()->session->set( 'custom_discount', $coupon_code );
// If there is an existing non empty cart active session we apply the coupon
if( ! WC()->cart->is_empty() )
WC()->cart->add_discount( $coupon_code );
// Add coupon code when a product is added to cart once
add_action('woocommerce_add_to_cart', 'add_coupon_code_to_cart', 10, 6 );
function add_coupon_code_to_cart( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data )
$coupon_code = WC()->session->get( 'custom_discount' );
$applied_coupons = WC()->session->get('applied_coupons');
if( empty($coupon_code) || in_array( $coupon_code, $applied_coupons ) ) return;
WC()->cart->add_discount( $coupon_code );
// Remove coupon code when user empty his cart
add_action('woocommerce_cart_item_removed', 'check_coupon_code_cart_items_removed', 10, 6 );
function check_coupon_code_cart_items_removed( $cart_item_key, $cart )
$coupon_code = WC()->session->get( 'custom_discount' );
if( $cart->has_discount( $coupon_code ) && $cart->is_empty() );
$cart->remove_coupon( $coupon_code );
代码进入您的活动子主题(或活动主题)的 function.php 文件或任何插件文件中。
这是经过测试并且有效的
【讨论】:
只是为了稍微改进一下这段代码,注意如果用户没有登录,用户的会话可能还不存在。所以我在add_coupon_code_to_cart_session
函数的开头添加了以下内容:if ( ! WC()->session->has_session() ) WC()->session->set_customer_session_cookie( true );
@ViniciusGarcia 我已经使用了in all those answers too… 无论如何谢谢
我没有注意到我在你的一个答案中发现了这个! :D GJ!以上是关于即使购物车在 WooCommerce 中为空,也可以通过 URL 中的 GET 方法应用优惠券折扣的主要内容,如果未能解决你的问题,请参考以下文章
在 WooCommerce 中为特定产品类别自定义“添加到购物车”按钮
当 Woocommerce 购物车为空时,向项目添加 CSS 类