以下のWooCommerceコアクラスメソッドをオーバーライドする必要があります。
私がやろうとしているのは、WooCommerceがカートに非販売商品と販売商品を入れてからクーポンコードを適用することを許可しないことです。クーポンUsage restriction
タブで以下のオプションがチェックされている場合
クーポンが販売中の商品に適用されない場合は、このチェックボックスをオンにします。商品ごとのクーポンは商品が販売されていない場合にのみ機能します。 カートごとのクーポンは、カートに販売品目がない場合にのみ機能します 。
カート内にセール商品がある場合でも、非セール商品にのみクーポンを適用する必要があります。クーポンは、非販売商品の金額にのみ影響し、単に販売商品の金額は無視します。
今、私はこのことで回避策を得ました、そして私は上記の方法で私自身のカスタム実装でオーバーライドしなければなりません。そしてご覧のとおり、どちらにも対応するフックはありません。
私はまた運なしでこの解決策を試しました
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可能
それはあなたがちょうど販売のためのよりよい昇進を得るべきであるように聞こえます