【问题标题】:How to disable cart page from showing coupon notice when adding coupons with ajax?使用ajax添加优惠券时如何禁用购物车页面显示优惠券通知?
【发布时间】:2016-02-28 01:49:56
【问题描述】:

我正在以编程方式在 woocommerce 中添加优惠券,并且通过另一个页面的 ajax 工作得很好,而不是结帐页面。但是,每次我去结帐页面时,它都会说“优惠券已应用”,但我已经从不同的页面应用了优惠券。在我执行 ajax 以动态应用优惠券后,如何在转到结帐页面时禁用此消息?当已从 ajax 函数应用优惠券时,是否有某种设置或函数可调用以禁止此消息显示在购物车页面上?

这是我的 php,用于通过 ajax 从单独的页面(不是结帐页面)应用优惠券:

if (!WC()->cart->add_discount( sanitize_text_field( $coupon_code )))
{
    $notices = wc_get_notices();
    if (!empty($notices) && isset($notices['error'])) {
        $last_fail = end($notices['error']);
        echo $last_fail;
    }
    die();
}
else
{
    $notices = wc_get_notices();

    // Get last element of array only!
    if (!empty($notices) && isset($notices['success'])) {
        $last_success = end($notices['success']);
        echo $last_success;
    }
    die();
}

这很好用。如您所见,我抓取错误并将它们返回到 ajax 调用的 response 中,并以这种方式输出错误。我还为成功输出了一些东西,这很好。我遇到的问题是,在通过 ajax 执行此功能后,我浏览到结帐页面以查看我的产品和已应用的优惠券代码,它会在页面顶部显示“优惠券已成功应用”。而且我不希望出现这个通知,但是我不想去掉所有的通知,就这个,如果没有在结帐页面应用优惠券,浏览时不需要出现这个wc_notice到结帐页面。

当我从另一个页面(通过 ajax)手动添加优惠券后浏览到结帐页面时,如何告诉 woocommerce 不要将此优惠券通知应用于结帐页面?

【问题讨论】:

    标签: ajax wordpress woocommerce coupon


    【解决方案1】:

    您可以使用“woocommerce_coupon_message”过滤器隐藏优惠券的成功消息。由于您只想为结帐页面删除它,因此只需检查当前页面是否为结帐页面。

    您可以使用以下代码:

    function remove_msg_filter($msg, $msg_code, $this){
    if(is_checkout()){
        return "";
    }
    return $msg;
    }
    
    add_filter('woocommerce_coupon_message','remove_msg_filter',10,3);
    

    注意:如果您还想更改错误消息,请使用“woocommerce_coupon_error”过滤器。

    【讨论】:

    • 我试过这个,但它似乎不起作用。优惠券通知仍然显示在结帐页面上。
    • 我还注意到通知不断堆积,每次提交优惠券后它们都不会被清除。因此,我发现自己必须使用 end(notices['error']); 获取最后一个 notices['error'] 才能获取特定于添加的优惠券的错误。
    • 我希望你已经在 ajax 函数之外编写了 add_filter。使用它,将删除结帐页面上的所有优惠券消息。由于此过滤器是在 add_discount() 函数调用的 add_coupon_message() 中提供的,因此它应该适合您。
    • 很抱歉,这个过滤器不起作用。我没有在 ajax 函数中使用它。我只是将它添加到主题functions.php 文件中,但它根本没有摆脱优惠券消息。当我访问结帐页面时,它们仍然在那里,并且它们仍然堆叠在另一个之上。
    • 我都试过了,woocommerce_coupon_messagewoocommerce_coupon_error,它们都不起作用。
    【解决方案2】:

    解决这个问题的方法是在函数调用中在die();之前添加wc_clear_notices();,以便删除函数add_discount添加到从wc_get_notices()函数调用返回的数组中的所有通知。

    if (!WC()->cart->add_discount( sanitize_text_field( $coupon_code )))
    {
        $notices = wc_get_notices();
        if (!empty($notices) && isset($notices['error'])) {
            $last_fail = end($notices['error']);
            echo $last_fail;
        }
        wc_clear_notices();
        die();
    }
    else
    {
        $notices = wc_get_notices();
    
        // Get last element of array only!
        if (!empty($notices) && isset($notices['success'])) {
            $last_success = end($notices['success']);
            echo $last_success;
        }
        wc_clear_notices();
        die();
    }
    

    【讨论】:

    • 为什么这个回复被设置为正确但有-1票?这是正确的吗?
    • 可能是因为正确的处理方式与实际的处理方式不同。我已经回答了我自己的问题,这对我的情况有用。
    【解决方案3】:

    这种方式可能有点懒惰。但是如果你检查页面的元素,找到消息,定位它并添加'display:none;'在 CSS 中。

    这应该可以解决问题。尝试使其仅针对该页面。唯一的类通常是在页面顶部的检查元素中找到的 page-id

    【讨论】:

    • 抱歉,这里似乎没有针对优惠券的特定类别,以便能够仅隐藏与优惠券相关的通知。我不想隐藏所有通知。仅与结帐页面上的优惠券相关。
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多