web-dev-qa-db-fra.com

Modifier les prix des produits via un crochet dans WooCommerce 3

DANS WooCommerce, je dois multiplier tous les prix des produits par un nombre. J'ai donc utilisé le suivant (via un plugin):

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;
 }

Mais, ce (ne fonctionne pas pour les produits de variation.}, J’ai essayé les crochets suivants sans succès:

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);

Le seul qui fonctionne à mi-chemin est celui-ci:

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

Mais cela a simplement changé le prix global, pas le prix de la variation choisie. Voir l'image ci-dessous, le prix est de BsF. 200 et le prix global est correct, 200 x 2 = 400, mais la variation du prix, une fois sélectionné, indique toujours 200:

_ {Remarque: j'ai besoin que cela change réellement, donc l'affichage des crochets HTML ne fonctionnera pas.} _

Variation Price

Y a-t-il quelque chose qui me manque ou quelque chose qui ne va pas?

7
KronosL

Mise à jour 3(septembre 2018) 

  • 2 versions de code pour les thèmes et les plugins (fonctionne aussi dans Woocommerce 3.3.x) 
  • Prix ​​des variations mises en cache dans Woocommerce 3 (mise à jour et ajout)
    Maintenant, utiliser woocommerce_get_variation_prices_hash crochet de filtre beaucoup plus efficace, au lieu de wc_delete_product_transients()… Voir ce fil de discussion lié

1) version du plugin} avec une fonction constructeur:

Les hooks que vous utilisez sont déconseillés dans WooCommerce 3+

Pour que cela fonctionne pour tous les prix des produits, y compris les prix des variations, vous devez utiliser ceci:

## 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;
}

Le code testé et fonctionne parfaitement (uniquement) dans WooCommerce 3+.


2) Pour la version du thème: _ {functions.php fichier sur le thème enfant actif (ou le thème actif):

// 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;
}

Testé et fonctionne sur woocommerce 3+


Pour les produits en vente, vous avez ces crochets:

  • woocommerce_product_get_sale_price(produits simples, groupés et externes)
  • woocommerce_variation_prices_sale_price(produits variables (min-max))
  • woocommerce_variation_prices_sale_price(variations de produits)

Prix ​​en cache et woocommerce 3:

Les 3 filtres crochets impliqués dans les variations de prix cachés sont:

  • woocommerce_variation_prices_price
  • woocommerce_variation_prices_regular_price
  • woocommerce_variation_prices_sale_price

Introduit dans Woocommerce 3, le hook de filtre woocommerce_get_variation_prices_hash sera permettra d’actualiser les variations des prix mis en cache de manière beaucoup plus efficace}, sans supprimer les transitoires associés à chaque exécution de ces hooks.

Donc, les performances resteront améliorées (Merci à Matthew Clark qui a indiqué ce meilleur moyen)

Voir: Mise en cache et tarification dynamique - Modifications à venir de la méthode get_variation_prices

7
LoicTheAztec