web-dev-qa-db-ja.com

Woocommerce 3でカートの商品価格を変更する

次の機能を使用して、カートの製品価格を変更しようとしています。

    add_action( 'woocommerce_before_shipping_calculator', 'add_custom_price' 
     );
      function add_custom_price( $cart_object ) {
         foreach ( $cart_object->cart_contents as $key => $value ) {
         $value['data']->price = 400;
        } 
     }

WooCommerceバージョン2.6.xでは正しく動作していましたが、バージョン3.0+では動作しなくなりました

WooCommerceバージョン3.0以降で動作させるにはどうすればよいですか?

ありがとう。

11
Archana

更新(2018年9月)

WooCommerceバージョン3.0 +が必要な場合:

  • 代わりに_woocommerce_before_calculate_totals_フックを使用します。
  • 代わりに WC_Cart get_cart() メソッドを使用するには
  • 代わりに WC_product set_price() メソッドを使用するには

コードは次のとおりです。

_add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart ) {

    // This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetition (when using price calculations for example)
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        $item['data']->set_price( 40 );
    }
}
_

コードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、または任意のプラグインファイルに含まれます。

このコードはテスト済みで動作します。

注:次のことができますフックの優先度を上げる from _20_ to _1000_(または偶数_2000_いくつかの特定のプラグインまたは他のカスタマイズを使用する場合。

関連:

38
LoicTheAztec

WooCommerceバージョン3.2.6では、優先度を1000に上げると@LoicTheAztecの答えが機能します。

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);

1099および999の優先度の値を試しましたが、カートの価格と合計は変わりませんでした(get_price()で確認できたにもかかわらずset_price()は実際にアイテムの価格を設定していました。

カートに料金を追加するカスタムフックがあり、製品属性を追加するサードパーティのプラグインを使用しています。これらのWooCommerceの「アドオン」により、カスタムアクションの遅延が必要な遅延が発生する可能性があります。

1
Tony