Изменение цен на продукцию с помощью крючка в WooCommerce 3
в 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 ответов
обновление 3 (сентябрь 2018)
- 2 версии кода для тем и плагинов (работает в Woocommerce 3.3.x too)
- кэшированные вариации цен в Woocommerce 3 (обновление и дополнение):
теперь с помощьюwoocommerce_get_variation_prices_hash
фильтр крюк гораздо более эффективным, вместоwc_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, 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;
}
код протестирован и отлично работает (только) в 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 $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;
}
протестировано и работает на woocommerce 3+
для продуктов в продаже у вас эти крючки:
-
woocommerce_product_get_sale_price
(простые, групповые и внешние продукты) -
woocommerce_variation_prices_sale_price
(переменные продукты (мин-макс)) -
woocommerce_variation_prices_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
фильтр крюк позволяют обновлять вариации кэшированных цен гораздо более эффективным способом, без удаления связанных переходных процессов в любое время, когда выполняются эти крючки.
таким образом, выступления останутся усиленными (спасибо Мэтью Кларк указал, что это лучший способ)
посмотреть: кэширование и динамическое ценообразование-предстоящие изменения метода get_variation_prices