web-dev-qa-db-ja.com

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フックは機能しません。

Variation Price

何か足りないものはありますか?

11
KronosL

Update 4(2019年9月)

  • テーマとプラグインの2つのコードバージョン(Woocommerce 3.3.xでも動作します)
  • Woocommerce 3のキャッシュされたバリエーション価格(更新および追加)
    今ではwc_delete_product_transients()の代わりにwoocommerce_get_variation_prices_hashフィルターフックを使用する方がはるかに効率的です... この関連スレッド を参照してください
  • 製品価格フィルターウィジェットフックを追加しました(末尾を参照)

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_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引数が1つあります$price
  • woocommerce_price_filter_widget_max_amount引数が1つあります$price
13
LoicTheAztec