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.
Installs: 95
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 4
Forks: 0
Open Issues: 1
Type:wordpress-plugin
Requires
- php: >=8.0
- automattic/jetpack-autoloader: ^3.0
- pronamic/pronamic-wp-updater: ^1.0
- pronamic/wp-number: ^1.3
Requires (Dev)
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.
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
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.
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 ); }
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(); }
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.