pronamic/pronamic-payment-gateways-fees-for-woocommerce

This WordPress plugin adds settings to all WooCommerce gateways to add a fixed and/or variable (percentage) fee.

v1.0.2 2024-03-14 11:38 UTC

This package is auto-updated.

Last update: 2024-10-14 12:47:16 UTC


README

Pronamic Payment Gateways Fees for WooCommerce

This WordPress plugin adds settings to all WooCommerce gateways to add a fixed and/or variable (percentage) fee.

Latest Stable Version Total Downloads Latest Unstable Version License PHP Version Require

Introduction

This WordPress plugin adds settings to all WooCommerce gateways to add a fixed and/or variable (percentage) fee.

Installation

composer require pronamic/pronamic-payment-gateways-fees-for-woocommerce
\Pronamic\WooCommercePaymentGatewaysFees\Plugin::instance()->setup();

Screenshots

Screenshot of the WooCommerce direct bank transfer payment method settings page in the WordPress admin dashboard with the extra fees settings.

Flow

WooCommerce recommends using the woocommerce_cart_calculate_fees hook to add fees:

We suggest using the action woocommerce_cart_calculate_fees hook for adding fees.

Source: https://github.com/woocommerce/woocommerce/blob/8.1.0/plugins/woocommerce/includes/class-wc-cart-fees.php#L7

This hook is called as soon as the WC()->cart->calculate_totals() function is called, WooCommerce uses the WC_Cart_Totals class to calculate totals:

class-wc-cart.php

/**
 * Calculate totals for the items in the cart.
 *
 * @uses WC_Cart_Totals
 */
public function calculate_totals() {
	$this->reset_totals();

	if ( $this->is_empty() ) {
		$this->session->set_session();
		return;
	}

	do_action( 'woocommerce_before_calculate_totals', $this );

	new WC_Cart_Totals( $this );

	do_action( 'woocommerce_after_calculate_totals', $this );
}

Source: https://github.com/woocommerce/woocommerce/blob/8.1.0/plugins/woocommerce/includes/class-wc-cart.php#L1393-L1411

When creating a WC_Cart_Totals instance, the WC_Cart_Totals->calculate() function is executed:

class-wc-cart-totals.php

/**
 * Run all calculation methods on the given items in sequence.
 *
 * @since 3.2.0
 */
protected function calculate() {
	$this->calculate_item_totals();
	$this->calculate_shipping_totals();
	$this->calculate_fee_totals();
	$this->calculate_totals();
}

Source: https://github.com/woocommerce/woocommerce/blob/8.1.0/plugins/woocommerce/includes/class-wc-cart-totals.php#L127-L154

What can be seen here is that the final totals are calculated after calculating the fee totals. This means that the order total is not yet available within the woocommerce_cart_calculate_fees hook. In other words, within the woocommerce_cart_calculate_fees hook the result of $cart->get_total( '' ) will always be 0.

This is inconvenient because the payment gateway fees are often based on the total amount to be paid. That's why we hook into the woocommerce_after_calculate_totals hook and recalculate the totals again. This extra calculation seems double, but it seems to be the easiest way to reliably request the cart total.

Links

Pronamic - Work with us