Изменение цен на товары с помощью крючка в 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);

Но это просто изменило общую цену, а не выбранную цену изменения. Смотрите изображение ниже, цена 200 швейцарских франков, и общая цена правильная, 200 х 2 = 400, но цена изменения при выборе по-прежнему показывает 200:

Примечание: Мне нужно, чтобы это действительно изменилось, поэтому отображение html-крючков не будет работать.

Variation Price

Я что-то упускаю или что-то не так?

Author: LoicTheAztec, 2017-08-22

1 answers

Обновление 3 ( Сентябрь 2018)

  • 2 версии кода для тем и плагинов (работает и в Woocommerce 3.3.x)
  • Кэшированные изменения цен в 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

 4
Author: LoicTheAztec, 2018-09-12 15:21:36