即使购物车在 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()-&gt;session-&gt;has_session() ) WC()-&gt;session-&gt;set_customer_session_cookie( true ); @ViniciusGarcia 我已经使用了in all those answers too… 无论如何谢谢 我没有注意到我在你的一个答案中发现了这个! :D GJ!

以上是关于即使购物车在 WooCommerce 中为空,也可以通过 URL 中的 GET 方法应用优惠券折扣的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 中为特定产品类别自定义“添加到购物车”按钮

Woocommerce - 未登录用户的购物车为空

当 Woocommerce 购物车为空时,向项目添加 CSS 类

如果购物车为空,购物车页面将重定向到 WooCommerce 中的商店页面?

php WooCommerce |测试购物车是否为空

当 Woocommerce 购物车为空时更改元素颜色