it-swarm.com.de

Produktpreise über einen Haken in WooCommerce 3 ändern

Bei WooCommerce muss ich alle Produktpreise mit einer Zahl multiplizieren. Also habe ich folgendes (über ein Plugin) verwendet:

add_filter('woocommerce_get_regular_price', array( $this, 'my_custom_price'), 99);
add_filter('woocommerce_get_price', array( $this, 'my_custom_price'), 99);

function my_custom_price( $original_price ) {
  global $post, $woocommerce;

  //Logic for calculating the new price here
  $new_price = $original_price * 2;

  //Return the new price (this is the price that will be used everywhere in the store)
  return $new_price;
 }

Aber das funktioniert nicht für Variationsprodukte.Ich habe die folgenden Haken ohne Erfolg ausprobiert:

add_filter('woocommerce_get_variation_regular_price', array( $this, 'my_custom_price'), 99);
add_filter('woocommerce_get_variation_price', array( $this, 'my_custom_price'), 99);

Die einzige, die auf halbem Weg funktioniert, ist diese:

add_filter('woocommerce_variation_prices_price', array( $this, 'my_custom_price'), 99);

Das hat aber nur den Gesamtpreis geändert, nicht den ausgewählten Variationspreis. Siehe das Bild unten, der Preis ist BsF. 200 und der Gesamtpreis stimmt, 200 x 2 = 400, aber der Variationspreis zeigt immer noch 200:

Hinweis: Ich muss es tatsächlich ändern, so dass HTML-Hooks nicht funktionieren.

Variation Price

Gibt es etwas, was ich vermisse oder was falsch ist?

7
KronosL

Update 3(September 2018) 

  • 2 Codeversionen für Themes und Plugins (funktioniert auch in Woocommerce 3.3.x) 
  • Zwischengespeicherte Variationspreise in Woocommerce 3 (Update und Hinzufügung)
    Jetzt mit woocommerce_get_variation_prices_hash filter hook viel effizienter, anstelle von wc_delete_product_transients() ... Siehe diesen verwandten Thread

1) Plugin-Version mit einer Konstruktorfunktion:

Die von Ihnen verwendeten Hooks werden in WooCommerce 3+ nicht mehr unterstützt

Damit es für alle Produktpreise funktioniert, einschließlich Variationspreise, sollten Sie Folgendes verwenden:

## The following goes inside the constructor ##

// Simple, grouped and external products
add_filter('woocommerce_product_get_price', array( $this, 'custom_price' ), 99, 2 );
add_filter('woocommerce_product_get_regular_price', array( $this, 'custom_price' ), 99, 2 );
// Variations 
add_filter('woocommerce_product_variation_get_regular_price', array( $this, 'custom_price' ), 99, 2 );
add_filter('woocommerce_product_variation_get_price', array( $this, 'custom_price' ), 99, 2 );

// Variable (price range)
add_filter('woocommerce_variation_prices_price', array( $this, 'custom_variable_price' ), 99, 3 );
add_filter('woocommerce_variation_prices_regular_price', array( $this, 'custom_variable_price' ), 99, 3 );

// Handling price caching (see explanations at the end)
add_filter( 'woocommerce_get_variation_prices_hash', array( $this, 'add_price_multiplier_to_variation_prices_hash' ), 99, 1 );


## This goes outside the constructor ##

// Utility function to change the prices with a multiplier (number)
public function get_price_multiplier() {
    return 2; // x2 for testing
}

public function custom_price( $price, $product ) {
    return $price * get_price_multiplier();
}

public function custom_variable_price( $price, $variation, $product ) {
    return $price * get_price_multiplier();
}

public function add_price_multiplier_to_variation_prices_hash( $hash ) {
    $hash[] = get_price_multiplier();
    return $hash;
}

Der Code wurde getestet und funktioniert (nur) in WooCommerce 3+.


2) Für Theme-Version:functions.php -Datei zum aktiven untergeordneten Theme (oder zum aktiven Theme):

// Utility function to change the prices with a multiplier (number)
function get_price_multiplier() {
    return 2; // x2 for testing
}

// Simple, grouped and external products
add_filter('woocommerce_product_get_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_get_regular_price', 'custom_price', 99, 2 );
// Variations
add_filter('woocommerce_product_variation_get_regular_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_variation_get_price', 'custom_price', 99, 2 );
function custom_price( $price, $product ) {
    return $price * get_price_multiplier();
}

// Variable (price range)
add_filter('woocommerce_variation_prices_price', 'custom_variable_price', 99, 3 );
add_filter('woocommerce_variation_prices_regular_price', 'custom_variable_price', 99, 3 );
function custom_variable_price( $price, $variation, $product ) {
    // Delete product cached price  (if needed)
    // wc_delete_product_transients($variation->get_id());

    return $price * get_price_multiplier();
}

// Handling price caching (see explanations at the end)
add_filter( 'woocommerce_get_variation_prices_hash', 'add_price_multiplier_to_variation_prices_hash', 99, 1 );
function add_price_multiplier_to_variation_prices_hash( $hash ) {
    $hash[] = get_price_multiplier();
    return $hash;
}

Getestet und funktioniert auf Woocommerce 3+


Für verkaufte Produkte haben Sie folgende Haken:

  • woocommerce_product_get_sale_price(Einfache, gruppierte und externe Produkte)
  • woocommerce_variation_prices_sale_price(Variable Produkte (min-max))
  • woocommerce_variation_prices_sale_price(Produktvariationen)

Zwischengespeicherte Preise und Woocommerce 3:

Die 3 Filterhaken, die an den zwischengespeicherten Variationen beteiligt sind, sind:

  • woocommerce_variation_prices_price
  • woocommerce_variation_prices_regular_price
  • woocommerce_variation_prices_sale_price

In Woocommerce 3 eingeführt, wird woocommerce_get_variation_prices_hash filter hook ermöglicht es, Änderungen zwischengespeicherter Preise auf viel effizientere Weise zu aktualisieren, ohne dass verwandte Transienten gelöscht werden, wenn diese Hooks ausgeführt werden.

Die Leistungen werden also aufrechterhalten bleiben (Dank an Matthew Clark das war der bessere Weg)

Siehe: Zwischenspeicherung und dynamisches Pricing - bevorstehende Änderungen an der Methode get_variation_prices

7
LoicTheAztec