Skip to main content

Hooks

Customizing Behavior via Hooks

The default behavior of Simpler Checkout is to exactly match the behavior of your wooCommerce store. This affects coupons, discounts and/or available shipping methods.

If you want to modify the checkout behavior only for the customers using Simpler Checkout you can use the programmatic hooks offered by our plugin to dynamically update the behavior of the Simpler Checkout form.

Customizing available shipping methods

The simplerwc_shipping_rates filter allows you to modify the shipping rates & methods available to customers using Simpler Checkout. It accepts the resolved shipping rates & the cart and should return the modified rates.

Removing a shipping rate for Simpler requests
add_filter(’simplerwc_shipping_rates’, function($methods) {

return array_filter($methods, function ($el) {
return $el->get_id() ≠ “my custom method”
});

});

Retrieving pickup location id

If you use a shipping method that requires extra information on top of the shipping method id (for example a store pickup method that requires a store id property), you will need to obtain the store that the shopper selected in their Simpler session.

You can leverage the simplerwc_after_set_checkout_data action to add your custom logic to the order creation process like this :

Retrieving pickup location id
add_action('simplerwc_after_set_checkout_data', function($order, $request) {
$methodId = $request->get_order()->get_shipping()->get_method_id();
if ($methodId != "local_pickup_method") {
// if not a local pickup order, return
return;
}

$pickupId = $request->get_order()->get_shipping()->get_pickup_location_id();
if (!$pickupId) {
throw new Error('invalid pickup id')
}

//you can use the pickup id in your custom logic here - for example :
$order->get_shipping_rate()->set_meta_data('store_location_id', $pickupId);
});

Disabling Simpler for Specific Products or Carts

If you want to implement custom logic for when the Simpler button is available, you can use the simplerwc_should_render_product_button and simplerwc_should_render_cart_button hooks.

For example, if you want to hide the Simpler button whenever the cart contains a product that belongs to a specific category :

add_filter('simplerwc_should_render_cart_button', function($cart) {
$categoryIdToDisable = 19;
foreach($cart->get_cart_contents() as $item) {
if (in_array($categoryIdToDisable, $item['data']['category_ids'])) {
return false;
}
}
return true;
});

You can apply the same logic for the product page button by using the simplerwc_should_render_product_button filter :

add_filter('simplerwc_should_render_cart_button', function($product) {
$categoryIdToDisable = 19;
return in_array($categoryIdToDisable, $product['data']['category_ids']);
});

Adding payment methods to Quote

The simplerwc_quotation_payment_method (available since v0.7.4) filter allows you to modify the payment methods available per shipping method during the quote process. It accepts the Quotation that the payment methods will be attached to and any previously attached payment methods.

Adding COD payment method to quote
add_filter('simplerwc_quotation_payment_method', function (array $paymentMethods, Quotation $quotation )
{
$availablePaymentMethods = WC()->payment_gateways()->get_available_payment_gateways();
// COD is not configured
if (!isset($availablePaymentMethods['cod'])) {
return $paymentMethods;
}
// COD is disabled
if ($availablePaymentMethods['cod']->enabled != 'yes') {
return $paymentMethods;
}
// COD isn't enabled for any shipping method
if ( ! ($cod = $availablePaymentMethods['cod'])->enable_for_methods) {
return $paymentMethods;
}
// COD isn't enabled for quote's shipping method (e.g. local pickup or BoxNow)
if ( ! in_array($quotation->get_shipping_rate()->get_method_id(), $cod->enable_for_methods)) {
return $paymentMethods;
}

$paymentMethods[] = new PaymentMethod(
$cod->id,
$cod->title,
PaymentMethod::COD,
Money::to_cents($cod->cost),
null,
null
);

return $paymentMethods;
}, 10, 2);

Changing the COD extra fee

The simplerwc_cod_cost filter (available since v1.1.0) allows you to modify the COD fee applied to an order during the submission process. It receives the cost, which is automatically parsed from another plugin, and lets you customize it according to your needs.

function custom_cod_cost($cost)
{
return 2.5;
}

add_filter('simplerwc_cod_cost', 'custom_cod_cost', 10, 2);

Adding a fee to an Order

The simplerwc_order_fees (available since v0.7.4) filter allows you to modify the fee closures that will be applied to the order during the order submission process. It accepts the OrderRequest send by Simpler Checkout and any previously added fees to the order.

Adding a fee for COD orders
add_filter('simplerwc_order_fees', function (array $closures, OrderRequest $orderRequest): array
{
if (!($paymentMethod = $orderRequest->get_order()->get_payment_method())
|| $paymentMethod->getType() != PaymentMethod::COD) {
return $closures;
}

$availablePaymentGateways = WC()->payment_gateways()->get_available_payment_gateways();
$paymentGateway = $availablePaymentGateways[$orderRequest->get_order()->get_payment_method()->getId()] ?? null;


$closures[] = function () use ($paymentGateway, $paymentMethod) {
WC()->cart->add_fee(
$paymentMethod->getName() ?: $paymentGateway->title,
$paymentMethod->getTotalCents() != null ? Money::from_cents($paymentMethod->getTotalCents()) : $paymentGateway->settings['extra_fee']
);
};

return $closures;
}, 10 , 2);

Adjusting the price per country

Simpler builds the quotation total from the cart components (products subtotal, shipping, fees and taxes). To affect the final price with your own logic — for example a country-specific charge — adjust a component rather than overriding the total. WooCommerce then recomputes the total, so the breakdown always reconciles (subtotal + shipping + fees + tax = total).

The component to use for an arbitrary +/- adjustment is a fee, applied at the cost-calculation stage via WooCommerce's woocommerce_cart_calculate_fees action. Simpler runs this stage both when quoting and when submitting the order, so the same charge is applied consistently — the customer is quoted and charged the same amount.

Applying a country-specific charge to Simpler quotes and orders
add_action('woocommerce_cart_calculate_fees', function ($cart) {
// Only affect Simpler sessions (the chosen payment method is set during quote & order).
if (WC()->session->get('chosen_payment_method') !== 'simpler') {
return;
}

$country = WC()->customer ? WC()->customer->get_shipping_country() : '';
if ($country !== 'GR') {
return;
}

// Compute the adjustment however you like (e.g. an external service).
// Use a negative amount to discount; the third argument controls whether it is taxable.
$cart->add_fee('Country adjustment', my_country_adjustment($cart), false);
});
For VAT specifically

VAT is a tax, not a flat charge. Prefer expressing it through WooCommerce's tax system — configure tax rates per country, or use the tax-rate / tax-class hooks — so the amount lands in the order's tax bucket and stays correct through the order, invoice and refund. Simpler already resolves the correct taxable address from the quote's shipping country, so location-based tax rates apply automatically.

note

This pattern keeps quote and order in sync because both run the same fee stage. If instead you want a charge that applies only when the order is submitted, use the simplerwc_order_fees filter described above.

Retrieving Invoice Details

When company invoices are enabled in your checkout, you can retrieve the company invoicing data and attach them to the order using the simplerwc_after_set_checkout_data action.

add_action('simplerwc_after_set_checkout_data', 'save_simpler_invoice_data', 10, 2);

// supposing your invoice implementation adds data to the order metadata array
function save_simpler_invoice_data($order, $request)
{
/**
* @var \WC_Order $order
* @var \Simpler\Models\OrderRequest $request
* */
if (!$request->is_invoice()) {
return;
}

$details = $request->get_invoice_details();
$order->add_meta_data('tax_id', $details->get_tax_id(), true);
$order->add_meta_data('company_name', $details->get_company_name(), true);
$order->add_meta_data('company_address', $details->get_company_address(), true);
$order->add_meta_data('company_activity', $details->get_company_activity(), true);
$order->add_meta_data('tax_authority', $details->get_tax_authority(), true);
}