web-dev-qa-db-ja.com

コアウーコマースクラスをオーバーライドする

以下のWooCommerceコアクラスメソッドをオーバーライドする必要があります。

私がやろうとしているのは、WooCommerceがカートに非販売商品と販売商品を入れてからクーポンコードを適用することを許可しないことです。クーポンUsage restrictionタブで以下のオプションがチェックされている場合

クーポンが販売中の商品に適用されない場合は、このチェックボックスをオンにします。商品ごとのクーポンは商品が販売されていない場合にのみ機能します。 カートごとのクーポンは、カートに販売品目がない場合にのみ機能します

カート内にセール商品がある場合でも、非セール商品にのみクーポンを適用する必要があります。クーポンは、非販売商品の金額にのみ影響し、単に販売商品の金額は無視します。

今、私はこのことで回避策を得ました、そして私は上記の方法で私自身のカスタム実装でオーバーライドしなければなりません。そしてご覧のとおり、どちらにも対応するフックはありません。

私はまた運なしでこの解決策を試しました

2
Rahil Wazir

1)最初のもののためのフックがあります:

apply_filtersを使うことができます

彼らのコード:

apply_filters( 'woocommerce_get_discounted_price', $price, $values, $this );

あなたのコード:

add_filter( 'woocommerce_get_discounted_price', function($price, $values, $this)
{
     //return whatever you want
},10,3
);
//*PHP 5.3 and up

add_filter関数の2番目のパラメータには、どんな関数でも渡すことができます。詳細はコーデックスをチェックしてください。

https://codex.wordpress.org/Function_Reference/add_filter

2)2番目のものは非常に厄介で、おそらくお勧めできません。

validate_cart_excluded_sale_items()関数にはフックがありませんが、結果はあなたがオーバーライドできる一時的な値に依存します(終わったときに元に戻すように注意しているなら)。

この機能の結果を調整することができます。wc_get_product_ids_on_sale()

彼らのコード:

// Load from cache
    $product_ids_on_sale = get_transient( 'wc_products_onsale' );
...
set_transient( 'wc_products_onsale', $product_ids_on_sale, DAY_IN_SECONDS * 30 );

あなたができること

$product_ids_on_sale関数から現在のget_transientを保存する

それからそれを空の配列に設定する

set_transient( 'wc_products_onsale', [], DAY_IN_SECONDS * 30 );

検証がパスしたらそれを元に戻す

set_transient( 'wc_products_onsale', $your_stored_product_ids_on_sale, DAY_IN_SECONDS * 30 );

また、私はこれをお勧めしません、しかし私はそれを示すことを望んでいましたIS可能

それはあなたがちょうど販売のためのよりよい昇進を得るべきであるように聞こえます

3
Douglas.Sesar