En la web PluginWP expliquen com implementar el Recàrrec d’Equivalència o Recargo de Equivalencia de forma fàcil a Woocommerce.
Primer cal afegir un nou Impost en Woocommerce, tant en les tarifes Estàndard com a les reduïdes, anomenat R.E:

Inspeccionant el codi podem traure el ID d’eixe impost. El número que identifica el RE a Woocommerce:

Finalment, afegim els IDS separats per comes al codi. Aquest codi va al “functions.php” o en un plugin propi:
// Añade la opción de aplicar el impuesto de Recargo de Equivalencia al pedido
if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){
class WC_Tax_Recargo_Equivalencia{
public $re_tax_ids = array();
public function __construct(){
$this->re_tax_ids = array( 8 ); // Aquí debes poner los IDs de tus tasas de Recargo de Equivalencia.
add_filter( 'woocommerce_find_rates', array( $this, 'add_recargo_equivalencia_tax' ), 10, 2 );
add_filter( 'woocommerce_cart_get_taxes', array( $this, 'update_cart_rows_taxes' ), 10, 2 );
add_filter( 'woocommerce_default_address_fields' , array( $this, 'agrega_checkbox_re_pagina_pago' ) );
add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'recargo_equivalencia_field_update_order_meta' ) );
add_action( 'wp_footer', array( $this, 'add_js_script_for_re' ), 99 );
add_action( 'woocommerce_calculated_total', array( $this, 'update_cart_totals' ), 10 , 2 );
add_action( 'init', array( $this, 'myStartSession' ), 1, 1 );
add_action( 'wp_logout', array( $this, 'myEndSession' ) );
add_action( 'wp_login', array( $this, 'myEndSession' ) );
add_action( 'wp_ajax_woocommerce_apply_recargo_equivalencia', array( $this, 'save_re_field_value' ), 10 );
add_action( 'wp_ajax_nopriv_woocommerce_apply_recargo_equivalencia', array( $this, 'save_re_field_value' ), 10);
}
public function add_recargo_equivalencia_tax( $matched_tax_rates, $args ){
global $post;
$activate_recargo_eq = isset( $_SESSION[ 'activate_recargo_equivalencia' ] )? $_SESSION[ 'activate_recargo_equivalencia' ] : false;
if ( !$activate_recargo_eq ) {
$this->exclude_re_tax_rates( $matched_tax_rates, $this->re_tax_ids );
}
return $matched_tax_rates;
}
public function update_cart_rows_taxes( $taxes, $cart ){
if ( is_cart() ) {
$this->exclude_re_tax_rates( $taxes, $this->re_tax_ids );
}
return $taxes;
}
public function update_cart_totals( $total, $cart ){
if ( is_cart() ) {
return;
}
$this->myStartSession();
if ( isset( $_SESSION[ 'activate_recargo_equivalencia' ] ) && $_SESSION[ 'activate_recargo_equivalencia' ] ) {
foreach ( $this->re_tax_ids as $tax_id ) {
$total += $cart->get_tax_amount( $tax_id );
}
}
return $total;
}
private function exclude_re_tax_rates( &$tax_rates ){
foreach ( $tax_rates as $key => $tax_rate ) {
if ( !is_object( $tax_rate ) && in_array( $key, $this->re_tax_ids ) ) {
unset( $tax_rates[ $key ] );
}
if ( is_object( $tax_rate ) && in_array( $tax_rate->tax_rate_id, $this->re_tax_ids ) ) {
unset( $tax_rates[ $key ] );
}
}
}
// Añade checkbox en página de pago para solicitar recargo de equivalencia
public function agrega_checkbox_re_pagina_pago( $fields ) {
$fields['recargo_de_equivalencia'] = array(
'label' => 'Marca esta opción si necesitas aplicar <span style="font-weight:bold;">Recargo de Equivalencia</span>',
'type' => 'checkbox',
'required' => false,
'class' => array('form-row-wide update_totals_on_change recargo_equivalencia'),
'clear' => true,
);
return $fields;
}
// Guarda el valor del checkbox de R.E. en el pedido
public function recargo_equivalencia_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST[ 'billing_recargo_de_equivalencia' ] ) ) {
update_post_meta( $order_id, 'recargo_de_equivalencia', sanitize_text_field( $_POST[ 'billing_recargo_de_equivalencia' ] ) );
}
}
// Script para actualizar totales cuando el checkbox de R.E. sea modificado
public function add_js_script_for_re(){
// Solo carga el script en la página de pago
if ( !is_checkout() ) return;
?>
<script type="text/javascript">
jQuery( document ).ready( function( $ ) {
$( 'form.checkout .update_totals_on_change input[type="checkbox"]' ).change( function (){
update_re_status();
});
// Ejecuta update_re_status cuando la página está cargada
update_re_status();
// Función para actualizar el estado de la opción R.E.
function update_re_status(){
// Inicializa la variable re
var re = false;
if ( $('.recargo_equivalencia input[type="checkbox"]')[0].checked ) {
re = true;
};
var data = {
action: 'woocommerce_apply_recargo_equivalencia',
security: wc_checkout_params.apply_recargo_equivalencia_nonce,
recargo_equivalencia: re,
};
jQuery.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: data,
success: function ( code ) {
if ( code === '0' ) {
jQuery( 'body' ).trigger( 'update_checkout' );
}
},
dataType: 'html'
});
return false;
};
});
</script>
<?php
}
// Inicia la variable global de sesión
public function myStartSession() {
if ( session_status() !== PHP_SESSION_ACTIVE ) {
session_start();
}
}
public function myEndSession() {
session_destroy ();
}
// Guarda el valor del checkbox de R.E. en la variable de sesión
public function save_re_field_value() {
if ( isset( $_POST[ 'recargo_equivalencia' ] ) ) {
$_SESSION[ 'activate_recargo_equivalencia' ] = $_POST[ 'recargo_equivalencia' ] == 'true' ? true : false;
}
}
}
new WC_Tax_Recargo_Equivalencia();
}
El resultat seria una casella per marcar si la teua compra té R.E. o no:

