通过WooCommerce 3+中的钩子更改产品价格

2022-08-30 19:07:57

在WooCommerce中,我需要将所有产品价格乘以一个数字。所以我使用了以下内容(通过插件):

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

但是,这不适用于变体产品。我尝试过以下钩子,但没有运气:

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

唯一一个半途而废的就是这个:

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

但这只是改变了整体价格,而不是选定的变化价格。见下图,价格为 BsF. 200,总价格正确,200 x 2 = 400,但选择时的变化价格仍显示 200:

注意:我需要它来实际更改,因此显示html钩子不起作用。

Variation Price

我错过了什么,或者有什么问题吗?


答案 1

更新(2020 年 12 月)

  • 2个主题和插件的代码版本(也适用于Woocommerce 3.3.x)
  • Woocommerce 3中的缓存变体价格(更新和添加):
    现在使用过滤器钩子更有效率,而不是...请参阅此相关主题woocommerce_get_variation_prices_hashwc_delete_product_transients()
  • 添加了产品价格过滤器小部件挂钩(请参阅末尾)。

1) 带有构造函数的插件版本:

您正在使用的钩子在WooCommerce 3 +中被弃用

要使其适用于所有产品价格,包括变体价格,您应该使用以下命令:

## 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, 3 );


## 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 (float) $price * get_price_multiplier();
}

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

public function add_price_multiplier_to_variation_prices_hash( $price_hash, $product, $for_display ) {
    $price_hash[] = get_price_multiplier();
    return $price_hash;
}

该代码经过测试,并且(仅在)WooCommerce 3 +中完美运行。


2)对于主题版本:功能.php活动子主题(或活动主题)上的文件):

// 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 (float) $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 (float) $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, 3 );
function add_price_multiplier_to_variation_prices_hash( $price_hash, $product, $for_display ) {
    $price_hash[] = get_price_multiplier();
    return $price_hash;
}

经过测试并在woocommerce 3 +上工作


对于销售中的产品,您有这些钩子:

  • woocommerce_product_get_sale_price (简单,分组和外部产品)
  • woocommerce_variation_prices_sale_price (可变产品(最小-最大))
  • woocommerce_product_variation_get_sale_price (产品变化)

缓存价格和woocommerce 3:

缓存价格变化中涉及的 3 个筛选器挂钩是:

  • woocommerce_variation_prices_price
  • woocommerce_variation_prices_regular_price
  • woocommerce_variation_prices_sale_price

在Woocommerce 3中引入,过滤器钩子将允许以更有效的方式刷新缓存价格的变化,而无需在执行此钩子时删除相关的瞬态。woocommerce_get_variation_prices_hash

因此,表演将保持提升(感谢马修·克拉克(Matthew Clark)指出了这种更好的方式)

请参见: 缓存和动态定价 – 即将对get_variation_prices方法进行的更改


要使用小部件(最低和最高价格)过滤产品价格,请使用以下挂钩:

  • woocommerce_price_filter_widget_min_amount 有一个参数 $price
  • woocommerce_price_filter_widget_max_amount 有一个参数 $price

答案 2

推荐