我写了这个函数,只是在 checkout 页面上增加了9%的额外费用.

现在,我想按ID排除一些产品,使其不会在一个函数中增加额外费用.

如何在对代码进行最小更改的情况下简单地做到这一点?

add_action( 'woocommerce_cart_calculate_fees', 'add_checkout_fee_for_gateway' );
function add_checkout_fee_for_gateway() {
    // Check if we are on the checkout page
    if ( is_checkout() ) {
        global $woocommerce;
        $chosen_gateway = $woocommerce->session->chosen_payment_method;
        if ( $chosen_gateway == 'paypal' ) {
            $percentage = 0.09;
            
            /* for all products prices + shipping (total price)
            $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
            */
            
            $surcharge = ( $woocommerce->cart->get_subtotal() ) * $percentage;
            $woocommerce->cart->add_fee( '9% value added tax', $surcharge, true, '' );
        }
    }
}

推荐答案

自从WooCommerce 3以来,您使用的代码有点过时了.

下面的代码将从特定的购物车项目计算小计(excluding some defined products)添加一个百分比的费用:

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

    // Only on checkout page and for specific payment method ID
    if ( is_checkout() && ! is_wc_endpoint_url() 
    && WC()->session->get('chosen_payment_method') === 'paypal' ) {
        // Here below define the product IDs to be excluded
        $excluded_product_ids = array(15, 18);
        $percentage_rate      = 0.09; // Defined percentage rate
        $custom_subtotal      = 0; // Initializing
        
        // Loop through cart items
        foreach( $cart->get_cart() as $item ) {
            // Calculate items subtotal from non excluded products
            if( ! in_array($item['product_id'], $excluded_product_ids) ) {
                $custom_subtotal += (float) $item['line_subtotal'];
            }
        }

        if ( $custom_subtotal > 0 ) {
            $cart->add_fee( __('9% value added tax'), ($custom_subtotal * $percentage_rate), true, '' );
        }
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

Php相关问答推荐

按制造商、型号和年份范围判断数据的存在性

如何隐藏x轴图表上的值

如何优化-PHP 7.3.14+Laravel 6

WooCommerce购物车中仅允许一个可下载产品

从WooCommerce购物车和 checkout 页面自定义发货标签

使用WordPress wp_mail()的邮箱标题无效

在特定订单状态更改时自定义WooCommerce订单发货项目

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

在WooCommerce中禁用客户用户角色的纳税计算

防止 WooCommerce 在前端加载全尺寸图像

Woocommerce 仅在前端为登录用户提供价格折扣

奇怪的 preg_match_all() 行为

PHP向API发送curl请求

WooCommerce 订单和邮箱通知的自定义产品描述

正则表达式抓取递归括号的内容

PHP 中的正则表达式,具有字符范围,但不包括特定字符

如果 static:: 被解析为B,为什么 PHP 会执行A的方法

如何将 2021-04-08T22:25:09.335541Z 作为时间戳保存到 Laravel 中的数据库中?

递归数组处理

PHP - $_GET、$_POST、$_REQUEST、$_COOKIE 和其他内置请求变量可以安全地显示给访问者吗?