programing

WooCommerce 3+에서 후크를 통해 제품 가격 변경

lastmemo 2023. 3. 2. 21:57
반응형

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 후크가 표시되지 않습니다.

변동 가격

제가 뭘 놓쳤거나 뭐 잘못된 거라도 있나요?

갱신하다 (2020년 12월)

  • 테마 및 플러그인용 코드 버전 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, 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) 테마 버전의 경우: 활성 자 테마(또는 활성 테마):

// 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

언급URL : https://stackoverflow.com/questions/45806249/change-product-prices-via-a-hook-in-woocommerce-3

반응형