Oui, il est possible de désactiver le prix des articles quantité clculation, mais il est assez compliqué ...
Le code:
// Custom line item Total/Subtotal price display
add_filter('woocommerce_cart_product_subtotal', 'custom_cart_subtotal', 10, 4);
function custom_cart_subtotal($product_subtotal, $product, $quantity, $wc_cart) {
$price = $product->get_price();
$taxable = $product->is_taxable();
$quantity = 1; // HERE We set the quantity to 1 (So the price is calculated on a quantitity of 1)
// Taxable
if ($taxable) {
if ('excl' === $wc_cart->tax_display_cart) {
$row_price = wc_get_price_excluding_tax($product, array('qty' => $quantity));
$product_subtotal = wc_price($row_price);
if ($wc_cart->prices_include_tax && $wc_cart->tax_total > 0) {
$product_subtotal .= ' <small class="tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
}
} else {
$row_price = wc_get_price_including_tax($product, array('qty' => $quantity));
$product_subtotal = wc_price($row_price);
if (! $wc_cart->prices_include_tax && $wc_cart->tax_total > 0) {
$product_subtotal .= ' <small class="tax_label">' . WC()->countries->inc_tax_or_vat() . '</small>';
}
}
} // Non-taxable
else {
$row_price = $price * $quantity;
$product_subtotal = wc_price($row_price);
}
return $product_subtotal;
}
// Custom cart subtotal and totals (Prices calculated on quatity = 1)
add_action('woocommerce_calculate_totals', 'custom_item_price', 10, 1);
function custom_item_price($wc_cart) {
if (is_admin() && ! defined('DOING_AJAX')) return;
$cart_contents_total = 0;
foreach ($wc_cart->get_cart() as $cart_item_key => $cart_item)
$cart_contents_total += floatval(strip_tags($wc_cart->get_product_subtotal($cart_item['data'], 1)));
$wc_cart->subtotal = $cart_contents_total;
$wc_cart->subtotal_ex_tax = $cart_contents_total;
$wc_cart->cart_contents_total = $cart_contents_total;
}
// Custom cart subtotal and totals (Prices calculated on quatity = 1)
add_action('woocommerce_cart_get_taxes', 'custom_cart_get_taxes', 10, 2);
function custom_cart_get_taxes($taxes, $wc_cart) {
if (is_admin() && ! defined('DOING_AJAX')) return;
$taxes = $subtotal_taxes = array();
foreach ($wc_cart->get_cart() as $cart_item_key => $cart_item){
foreach($cart_item['line_tax_data']['subtotal'] as $key => $tax_price){
if($tax_price > 0){
if(array_key_exists($key, $subtotal_taxes))
$subtotal_taxes[$key] += number_format($tax_price/$cart_item['quantity'], 2);
else
$subtotal_taxes[$key] = number_format($tax_price/$cart_item['quantity'], 2);
} else {
if(array_key_exists($key, $subtotal_taxes))
$subtotal_taxes[$key] += $tax_price;
else
$subtotal_taxes[$key] = $tax_price;
}
}
}
foreach (array_keys($subtotal_taxes + $wc_cart->get_shipping_taxes()) as $key) {
$taxes[ $key ] = (isset($wc_cart->get_shipping_taxes()[ $key ]) ? $wc_cart->get_shipping_taxes()[ $key ] : 0) + (isset($subtotal_taxes[ $key ]) ? $subtotal_taxes[ $key ] : 0);
}
return $taxes;
}
// Custom line item Total/Subtotal set order prices (Prices calculated on quatity = 1)
add_action('woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 10, 4 );
function custom_checkout_create_order_line_item($item, $cart_item_key, $values, $order){
$line_tax_data = array();
foreach($values['line_tax_data'] as $key_line => $tax){
foreach($tax as $key => $tax_price){
if($tax_price > 0)
$line_tax_data[$key_line] = array($key => number_format($tax_price/$values['quantity'], 2));
else
$line_tax_data[$key_line] = array($key => $tax_price);
}
}
$item->set_props(array(
'quantity' => $values['quantity'],
'variation' => $values['variation'],
'subtotal' => number_format($values['line_subtotal']/$values['quantity'], 2),
'total' => number_format($values['line_total']/$values['quantity'], 2),
'subtotal_tax' => number_format($values['line_subtotal_tax']/$values['quantity'], 2),
'total_tax' => number_format($values['line_tax']/$values['quantity'], 2),
'taxes' => $line_tax_data,
));
}
// Get the correct Cart gran total amount
add_filter('woocommerce_calculated_total', 'custom_calculated_total', 10, 2);
function custom_calculated_total($price_total, $wc_cart){
$tax_total = 0;
$taxes_arr = $wc_cart->get_taxes();
foreach($taxes_arr as $tax)
$tax_total += $tax;
return round($wc_cart->cart_contents_total + $tax_total + $wc_cart->shipping_total + $wc_cart->fee_total, $wc_cart->dp);
}
// Replacing the total tax amount
add_action('woocommerce_checkout_create_order', 'custom_set_order_tax_total', 10, 1);
function custom_set_order_tax_total($order) {
$subtotal_taxes = 0;
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item){
foreach($cart_item['line_tax_data']['subtotal'] as $key => $tax_price){
if($tax_price > 0){
$subtotal_taxes += number_format($tax_price/$cart_item['quantity'], 2);
} else {
$subtotal_taxes += $tax_price;
}
}
}
$order->set_cart_tax($subtotal_taxes);
}
// Update order line item tax total
add_action('woocommerce_checkout_update_order_meta', 'custom_update_order_item_tax_total', 10, 1);
function custom_update_order_item_tax_total($order_id) {
global $wpdb;
$query = $wpdb->get_results("
SELECT woim.meta_id, woim.order_item_id as item_id, woi.order_item_type as type, woim.meta_key as akey, woim.meta_value as value
FROM {$wpdb->prefix}woocommerce_order_items AS woi
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
WHERE woi.order_id = $order_id
AND woim.meta_key IN ('tax_amount', '_line_tax_data', 'rate_id')
");
$taxes = $items = array();
foreach($query as $result){
if($result->type == 'line_item'){
$result_taxes = maybe_unserialize($result->value);
foreach($result_taxes['subtotal'] as $tax_id => $tax_price)
$taxes[$tax_id] = $tax_price;
} elseif($result->type == 'tax' && $result->akey == 'rate_id') {
$items[$result->item_id] = array(
'price' => $taxes[$result->value],
'rate_id' => $result->value
);
} else {
$items[$result->item_id]['meta_id'] = $result->meta_id;
}
}
foreach($items as $item_id => $values){
wc_update_order_item_meta($item_id, 'tax_amount', $values['price']);
}
}
Code va dans le fichier function.php de votre thème enfant actif (ou le thème) ou aussi dans n'importe quel fichier plugin.
Testé sur WooCommerce 3+ et fonctionne (pour les prix incluant les taxes ou les taxes).
Je ne le testerai pas avec frais et réductions. Il se peut donc que vous ayez besoin d'un code supplémentaire ...