2017-12-19 18 views
1

Ich möchte wissen, wie Sie die Preisberechnung abhängig von einigen internen Codierung aktualisieren. Dies ist der Preis, der in den Einkaufswagenartikel gehen muss, und bis jetzt zeigt der Einkaufswagenartikel nur die Grundkosten des Produkts an.Woocommerce - Benutzerdefinierte Warenkorb Artikel Preisberechnung

Technisch sollte der Preis geändert werden, wenn ein Produkt in den Warenkorb hinzugefügt wird.

Ich dachte, es so kalkuliert und zugeschickt musste:

global $woocommerce; 
$items = $woocommerce->cart->get_cart(); 

foreach($items as $item => $values) { 
    if ($value['product_id'] == $product_id) { 
     $value['data']->set_price($price); 
    } 
} 

Da dies der Trick nicht tun, wo/wann muss ich die set_price() Funktion setzen. Wenn dies aufgerufen wird, ist der Einkaufswagen noch leer und die Schleife wird nicht eingegeben.

Mein Problem scheint mit Woocommerce Bookings zu sein, wie mit folgender Zeile $ this-> Preis wird nicht gesetzt und dann get_base_cost heißt nur die Basiskosten und nicht den "neu berechneten" Preis. Da es sich um ein buchbares Produkt handelt, scheint es schwieriger zu sein.

public function get_price($context = ‘view’) { 
    return apply_filters('woocommerce_get_price', $this->price ? $this->price : $this->get_base_cost(), $this); 
} 

Bei genauem Hinsehen $ dieses ich kann zumindest die beiden Preise in der class_wc_product_booking sehen, wo 300 die „Grundkosten“ und 250 der neu berechnete Preis, der bezahlt werden muss.

Ich löschte eine Menge des Arrays, das für dieses Problem nicht relevant sein sollte.

WC_Product_Booking Object ( 
[availability_rules:WC_Product_Booking:private] => Array () 
[object_type:protected] => product 
[post_type:protected] => product 
[cache_group:protected] => products 
[data:protected] => 
    Array ( 
     [name] => Booking Test 
     [slug] => Booking Test 
     [sku] => 
     [price] => 300 
     [regular_price] => 
     [sale_price] => 
     [rating_counts] => Array () 
     [average_rating] => 0 
     [review_count] => 0 
    ) 
[supports:protected] => Array () 
[id:protected] => 1708 
[changes:protected] => Array ([price] => 250) 
[meta_data:protected] => 
[product_type] => booking 
) 

Antwort

2

Dies muss auf woocommerce_before_calculate_totals Aktionshaken durchgeführt werden, um zu arbeiten. Im Folgenden ein Arbeitsbeispiel, wo es 30 zu jedem Produkt des Preis im Warenkorb Artikel ergänzt:

add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1); 
function custom_cart_item_price($cart) { 

    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    foreach ($cart->get_cart() as $cart_item){ 
     $price = $cart_item['data']->get_price(); // Get the product price 
     $new_price = $price + 30; // the calculation 
     $cart_item['data']->set_price($new_price); // Set the new price 
    } 
} 

Dieser Code geht in function.php Datei Ihres aktiven Kind Thema (oder Thema) oder auch in jeder Plugin-Datei.


Auch global $woocommerce; mit $woocommerce->cart wurde von WC()->cart stattdessen ersetzt.

+0

viel senden helfen ich Ihren Code in die functions.php kopiert und der Warenkorbpreis hat sich überhaupt nicht geändert? Auch mache ich einige Preisberechnungen abhängig von einem Formular und würde diesen Preis innerhalb der custom_cart_item_price Funktion benötigen? – achiever

+1

@achiever Dieser Code funktioniert, fügt hinzu, es ist sehr klassisch (es gibt eine Menge Antworten auf SO) ... Vielleicht ist es besser, dass Sie Ihre Frage mit dem zugehörigen Code Ihrer Berechnungen aktualisieren ... wir wissen nicht wo und wie Du machst das eigentlich. So können wir Ihnen besser helfen. Sie sollten uns auch einige Informationen bezüglich der von Ihnen verwendeten WooCommerce-Version geben. Die neue Antwort von ** Aakanksh Patel ** funktioniert auch gut. – LoicTheAztec

+0

Ich bin mir sicher, dass der Code funktioniert! Es ändert noch nicht "meinen" Preis, aber das könnte viele Gründe haben. Woocommerce v. 3.2.5 – achiever

1

Versuchen Sie, in den Warenkorb gelegt vor dem Senden der Preis individuelle Art und Weise zu ändern, wenn ja, dann müssen Sie nach Sitzung die folgenden zwei Haken

add_filter('woocommerce_add_cart_item' , 'set_woo_prices'); 
add_filter('woocommerce_get_cart_item_from_session', 'set_session_prices', 20 , 3); 

function set_woo_prices($woo_data) { 
    session_start();  
    $tac_dd_discounted_price = $_SESSION['']; // get the updated new price field 

    if (! isset($tac_dd_discounted_price) || empty ($tac_dd_discounted_price)) { return $woo_data; } 
    $woo_data['data']->set_price($tac_dd_discounted_price); 
    $woo_data['my_price'] = $tac_dd_discounted_price; 
    return $woo_data; 
} 

function set_session_prices ($woo_data , $values , $key) { 
    if (! isset($woo_data['my_price']) || empty ($woo_data['my_price'])) { return $woo_data; } 
    $woo_data['data']->set_price($woo_data['my_price']); 
    return $woo_data; 
} 
Verwandte Themen