2017-10-19 20 views
0

Je cherche la fonction qui peut désactiver la quantité x prix de l'article dans la page du panier.Désactiver Woocommerce panier article quantité calcul du prix

Normalement, si le prix du produit est €1 et la quantité est 3 | Le sous-total de l'élément de campagne est €3 ... (1€ x 3).

Maintenant, je voudrais garder le prix du produit sans calcul de la quantité de x comme ceci:
prix des produits est €1 et la quantité est 3 | Le sous-total de l'élément de campagne est €1

Est-ce que quelqu'un a une idée comment désactiver ce calcul du prix de quantité?

Répondre

1

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 ...