添加 ajax 优惠券时,如何禁止购物车页面显示优惠券通知?

How to disable cart page from showing coupon notice when adding coupons with ajax?

我正在以编程方式在 woocommerce 中添加优惠券,并且通过 ajax 从另一个页面(而不是结帐页面)工作得很好。然而,每次我去结账页面时,它都会说,"Coupon has been applied",但我已经从另一个页面应用了优惠券。在我执行 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 执行此功能后,我浏览到结帐页面以查看我的产品和应用的优惠券代码,它在页面顶部发出通知,说 "Coupon applied Successfully." 并且我不希望出现此通知,但我不想删除所有通知,仅此一个,如果优惠券未在结帐页面上应用,则不需要此 wc_notice 在浏览结帐页面时出现。

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

这种方法可能有点懒惰。但是,如果您检查页面的元素,找到消息,定位它并在 CSS.

中添加 'display:none;'

这应该可以解决问题。尝试使其仅针对该页面。唯一的 class 通常是在 inspect element

页面顶部找到的 page-id

您可以使用“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”过滤器。

解决这个问题的方法是在函数调用中的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();
}