2017-10-19 13 views
0

カートのページで数量xの商品価格を無効にできる機能を探しています。Woocommerceカート品目数量価格計算を無効にする

通常、製品価格が€1であり、数量が3ならば|広告申込情報の小計は€3 ... (1€ x 3)です。

今、私はこのようなX量算出せずに製品価格を維持したいと思います:
製品の価格は€1で、数量は3あり|広告申込情報の小計は€1

この数量計算を無効にする方法はありますか?

答えて

1

はい...それは、数量項目の価格のclculationを無効にすることは可能だが、それは非常に複雑だ

コード:

// 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']); 
    } 
} 

コードがfunction.phpのアクティブな子テーマのファイル(またはテーマに行きます)または任意のプラグインファイルでも使用できます。

WooCommerce 3+でテストされ、動作します(税金または税金を含む価格の場合)。

私はそれをでテストします。だから、いくつかの追加コードが必要になるかもしれません...

関連する問題