wordpress WooCommerce以编程方式添加的费用不会持续存在

hmtdttj4  于 2024-01-06  发布在  WordPress
关注(0)|答案(3)|浏览(211)

我通过挂钩到woocommerce_cart_calculate_fees操作来向购物车添加自定义费用,如下所示:

if (isset($_GET['discount'])) {


        add_action('woocommerce_cart_calculate_fees', 'add_loyalty_discounts');
    }

    function add_loyalty_discounts(WC_Cart $cart)
    {
        $total = 0;

        global $woocommerce;

        foreach (WC()->cart->get_cart() as $cart_item_key => $item) {

            $total += $item['data']->regular_price;

            $woocommerce->cart->cart_contents[$cart_item_key]['discount_amount'] = $_GET['discount'];
        }

        if ($total < $_GET['discount']) {
            wc_add_notice('You must spend more than €' . $_GET['discount'] . ' to use your loyalty discount.', 'error');
        } else {

            $current_user = wp_get_current_user();

            $loyalty_points = empty(get_user_meta($current_user->ID, 'loyalty_points', true)) ? 0 : get_user_meta($current_user->ID, 'loyalty_points', true);

            $loyalty_points  = 100;

            if ($loyalty_points < $_GET['discount']) {
                wc_add_notice('You do not have enough loyalty points to apply this discount.', 'error');
            } else {

                $cart->add_fee('Loyalty Discount',   -intval($_GET['discount']), true);
            }
        }
    }

字符串
费用显示在购物车页面上,但不会持续到结账和订单页面。
我试过使用$cart->set_session(),但没有效果。
更新:我已经创建了一个新的WP网站与空白主题(blankslate),只有最新版本的WooCommerce安装,我仍然得到错误。

qgzx9mmu

qgzx9mmu1#

**更新 (基于您新添加的代码)

你不能在woocommerce_cart_calculate_fees钩子中使用$_GET$_POST$_REQUEST,因为这些变量会丢失。相反,你应该将你的$_GET 'discount']存储在WC_Session变量中。
现在,你的代码已经过时了,有一些错误和遗漏的东西。
请尝试以下重新访问的代码:

add_action('template_redirect', 'save_discount_in_session');
function save_discount_in_session() {
    if ( isset($_GET['discount']) ) {
        WC()->session->set('loyalty_discount', floatval($_GET['discount']));
    }
}

add_action('woocommerce_cart_calculate_fees', 'add_loyalty_discounts');
function add_loyalty_discounts($cart){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $discount = (float) WC()->session->get('loyalty_discount');
    $subtotal = (float) WC()->cart->subtotal;

    if ( $discount > 0 ) {
        if ( $subtotal >= $discount ) {
            $loyalty_points = (int) get_user_meta(get_current_user_id(), 'loyalty_points', true);
    
            if ( $loyalty_points >= $discount ) {
                $cart->add_fee( __('Loyalty Discount'), -$discount );
            } else {
                wc_clear_notices();
                wc_add_notice( __('You do not have enough loyalty points to apply this discount.'), 'error');
            }
        } else {
            wc_clear_notices();
            wc_add_notice( sprintf( __('You must spend more than %s to use your loyalty discount.'), wc_price($discount) ), 'error');
        }
    }
}

字符串
代码放在你的子主题的function.php文件中(或插件中)。它应该可以工作。
要仅在结账页面应用费用,您将使用:用途:

add_action('woocommerce_cart_calculate_fees', 'add_loyalty_discounts');
function add_loyalty_discounts($cart) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( is_cart() )
        return;
        
    $cart->add_fee('Loyalty Discount', -100);
}


相关:

  • WooCommerce中一个免费产品的数量折扣
  • WooCommerce回购自定义插件:如何更新用户钱包?
  • 为Woocommerce中的特定用户角色应用折扣
zf2sa74q

zf2sa74q2#

我测试,它的工作与我的购物车和结帐页面都很好

function add_loyalty_discounts(WC_Cart $cart) {
        $cart->add_fee('Loyalty Discount', -intval(100), true);
}

add_action('woocommerce_cart_calculate_fees', 'add_loyalty_discounts');

字符串

7gcisfzg

7gcisfzg3#

原因是没有添加费用是因为我只在购物车页面上添加了费用。WC_Cart类不持久化费用。

相关问题