通过 WooCommerce 中的挂钩更改产品价格 3+ [英] Change product prices via a hook in WooCommerce 3+

查看:62
本文介绍了通过 WooCommerce 中的挂钩更改产品价格 3+的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

IN WooCommerce, I need to multiply all product prices by a number. So I have used the following (via a 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;
 }

但是,这不适用于变体产品.我尝试了以下钩子但没有成功:

But, that doesn't work for variation products. I have tried the following hooks with no luck:

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:

But that just changed the overall price, not the selected variation price. See the image below, price is BsF. 200 and the overall price is right, 200 x 2 = 400, but the variation price when selected still shows 200:

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

有什么我遗漏的地方,或者有什么问题吗?

Is there anything I'm missing, or something wrong?

推荐答案

更新(2020 年 12 月)

  • 主题和插件的 2 个代码版本(也适用于 Woocommerce 3.3.x)
  • Woocommerce 3 中缓存的变体价格(更新和添加):
    现在使用 woocommerce_get_variation_prices_hash 过滤器钩子效率更高,而不是 wc_delete_product_transients()…见此相关主题
  • 添加了产品价格过滤器小部件挂钩(见文末).
  • 2 code versions for themes and plugins (works in Woocommerce 3.3.x too)
  • Cached variations prices in Woocommerce 3 (Update and addition):
    Now using woocommerce_get_variation_prices_hash filter hook much more efficient, instead of wc_delete_product_transients()… See this related thread
  • Added product price filter widget hooks (see at the end).

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

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

The hooks that you are using are deprecated in WooCommerce 3+

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

To make it work for all products prices, including variations prices, you should use this:

## 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+ 中的代码.

The code tested and perfectly works (only) in WooCommerce 3+.

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

2) For theme version: functions.php file on active child theme (or active 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 (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+ 上测试并运行

Tested and works on woocommerce 3+

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

For products in sale you have those hooks:

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

变化缓存价格中涉及的 3 个过滤器钩子是:

The 3 filters hooks involved in variations cached prices are:

  • woocommerce_variation_prices_price
  • woocommerce_variation_prices_regular_price
  • woocommerce_variation_prices_sale_price

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

Introduced in Woocommerce 3, woocommerce_get_variation_prices_hash filter hook will allow to refresh variations cached prices in a much more efficient way, without deleting related transients anytime that this hooks are executed.

因此性能将保持提升(感谢 Matthew Clark 指出了这个更好的方法)

So performances will stay boosted (Thanks to Matthew Clark that pointed this better way)

参见:缓存和动态定价 - get_variation_prices 方法即将发生的变化

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

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

这篇关于通过 WooCommerce 中的挂钩更改产品价格 3+的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆