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

Posted

技术标签:

【中文标题】通过 WooCommerce 3+ 中的挂钩更改产品价格【英文标题】:Change product prices via a hook in WooCommerce 3+ 【发布时间】:2018-01-30 01:37:58 【问题描述】:

在 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 挂钩不起作用。

我有什么遗漏或有什么问题吗?

【问题讨论】:

【参考方案1】:

更新 (2020 年 12 月)

主题和插件的 2 个代码版本(也适用于 Woocommerce 3.3.x) Woocommerce 3 中的缓存变化价格(更新和添加):现在使用 woocommerce_get_variation_prices_hash 过滤器挂钩效率更高,而不是 wc_delete_product_transients()... 请参阅 this related thread 添加了产品价格过滤器小部件挂钩(见最后)

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) 对于主题版本: functions.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 指出了更好的方法)

见:Caching and dynamic pricing – upcoming changes to the get_variation_prices method


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

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

【讨论】:

谢谢!现在它只有在我使用插件删除数据库瞬变以查看更改时才有效。有没有办法用函数自动删除那些瞬态?? 您能指导我如何将其正确添加到 my_custom_price 函数中吗?在此先感谢,很好的回答! @KronosL 用wc_delete_product_transients($post->ID); 更新了我的答案……因为这在从插件中使用时似乎是特定的。当您通过主题使用该挂钩时,此问题不存在。之后这还不够……所以你必须搜索一下。 这似乎不起作用所有价格都变成了 0 @kos 我已经测试、更正和更新了代码...现在有 2 个版本,所以根据它是用于插件还是活动主题 function.php 文件选择好的版本。跨度>

以上是关于通过 WooCommerce 3+ 中的挂钩更改产品价格的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 订阅中的订阅频率和价格变化挂钩

通过 WooCommerce 管理员电子邮件通知中的“woocommerce_email_order_meta”挂钩显示产品自定义字段

WooCommerce 插件 PHP 挂钩上的空 $order 变量

Woocommerce 订单 API 订单项 ID 在更新时更改

通过其 slug 获取 WooCommerce 产品类别的 id

在 WooCommerce 中更改订单运费总额