La clase EDD\Fees\Handler se puede usar para agregar tarifas arbitrarias al carrito de compras, tanto positivas como negativas (descuento). Por ejemplo, podrías agregar una tarifa especial de descuento del 10% automáticamente para todos los usuarios registrados que tengan un cierto rol de usuario, o agregar una tarifa de "manipulación" para todos los productos dentro de una categoría determinada. Las opciones son ilimitadas.
Las tarifas se almacenan como variables de sesión, lo que significa que una vez que se establecen para un usuario, persistirán hasta que el usuario complete la compra o sean eliminadas por algún código basado en una decisión o configuración.
Tipos de tarifas
Las tarifas pueden tener dos tipos:
fee: Esto es exactamente lo que suena: un costo o descuento adicional agregado a toda la compra.item: Esta es una tarifa que no está asociada con nada más. Piénsalo como un producto temporal creado sobre la marcha. Los depósitos en billetera son un ejemplo de este tipo de tarifa.
Nota: las tarifas negativas siempre establecen no_tax en true.
add_fee()
Agregar un gasto o dar un descuento se consideran ambos agregar tarifas, a pesar del hecho de que uno de ellos está quitando dinero.
Agregar una tarifa se hace con código similar a esto:
function eddwp_set_admin_discount() {
// Check to see the customer is a site admin.
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
// find 20% of the total
$amount = edd_get_cart_subtotal() * 0.20;
// Flip the 20% from a positive number to a negative number
$amount = $amount * -1;
// Add the fee, sending the amount, the reason printed to the front end, and the handle
EDD()->fees->add_fee(
array(
'price_id' => null, // set this to link the fee to a specific price ID.
'amount' => $amount,
'label' => 'You are an admin special!',
'id' => 'admin_special',
'type' => 'fee',
'no_tax' => false,
'download_id' => 0, // set this to link the fee to a specific product.
)
);
}
add_action( 'template_redirect', 'eddwp_set_admin_discount' );
Este ejemplo agrega automáticamente un descuento del 20% si el usuario actual es un administrador.
Aquí hay otro ejemplo que agrega una tarifa de manipulación:
function eddwp_add_handling_fee() {
// Add a $10 handling fee no matter what
EDD()->fees->add_fee(
array(
'amount' => 10,
'label' => 'Handling fee',
'id' => 'handling_fee',
'type' => 'fee',
'no_tax' => false,
'download_id' => 0,
)
);
}
add_action( 'template_redirect', 'eddwp_add_handling_fee' );
Here’s a screenshot of both of the above examples being applied at the same time: 
remove_fee()
Para eliminar una tarifa, simplemente pasa el ID de la tarifa (tercer parámetro arriba) al método remove_fee():
function pw_remove_handling_fee() {
EDD()->fees->remove_fee( 'handling_fee' );
}
add_action( 'template_redirect', 'pw_remove_handling_fee', 9999 );
Otros métodos
Además de simplemente agregar y eliminar tarifas, hay una serie de métodos para trabajar con tarifas en el backend.
has_fees( string $type = ‘fee’ )
Este método simplemente verifica si existen tarifas. Por defecto es del tipo fee, pero también puede aceptar item.
Ejemplo:
if ( EDD()->fees->has_fees() ) {
echo 'yep, we can haz fees!';
}
Devuelve: true o false.
get_fees( string $type = ‘fee’, integer $download_id = 0 )
Este método obtendrá una matriz de todas las tarifas existentes. Puede ser limitada por tipo y/o ID de descarga.
Ejemplo
La extensión Simple Shipping es un ejemplo perfecto de cómo se puede usar la clase EDD_Fees.
$fees = EDD()->fees->get_fees();
Devuelve algo como esto:
Array
(
[handling_fee] => Array
(
[amount] => 11.00
[label] => Handling Fee
[type] => fee
[no_tax] =>
[download_id] => 0
[price_id] =>
)
[admin_special] => Array
(
[amount] => -2
[label] => You are an admin special!
[type] => fee
[no_tax] =>
[download_id] => 0
[price_id] =>
)
[tophers_fee] => Array
(
[amount] => 42.00
[label] => Topher's fee
[no_tax] =>
[type] => fee
[download_id] => 114
[price_id] =>
)
)
get_fee( string $id = ” )
Este método obtendrá una matriz de una tarifa específica, identificada por el nombre que se le dio cuando se creó.
Ejemplo:
$my_custom_fee = EDD()->fees->get_fee( 'my_custom_fee' );
Devuelve algo como esto:
Array
(
[amount] => 42.00
[label] => The Final Fee
[no_tax] =>
[type] => fee
[download_id] => 114
)
type_total( string $type = ‘fee’ )
Este método calcula el total para un tipo específico de tarifa. Los tipos admitidos son ‘fee’ y ‘item’.
Ejemplo:
$item_total = EDD()->fees->type_total( 'item' );
Devuelve un número como 51.00
total( integer $download_id = 0 )
Este método calcula el total de todas las tarifas O todas las tarifas específicamente asociadas a una descarga dada.
Nota: Si un producto tiene tarifas y precios variables, la tarifa solo se aplicará una vez por transacción, NO una vez por artículo.
Ejemplo:
$total = EDD()->fees->total(); $total = EDD()->fees->total( '42' );
En el ejemplo anterior, el primero devolvería un número como 51.00 que es la suma de todas las tarifas.
El segundo ejemplo devolvería un número como 51.00 que es la suma de todas las tarifas vinculadas específicamente a la descarga con el ID 42.
record_fees( array $payment_meta, array $payment_data )
Este método registra la información de las tarifas sobre una transacción específica. Nunca debe ser llamado directamente.
