非常にカスタマイズされた製品を販売する必要があるクライアントがいます。製品には、6、24、11、および 11 のオプションを持つ 4 つの属性があります。合計すると、17000 を超えるユニークな組み合わせになります。これらは、(1) 手作業が多すぎる、(2) WP データベースが不必要にいっぱいになる、(3) それらの価格が変わるため、バリエーションに入力できません。
価格は、年に数回調整する必要がある複雑なスプレッドシートに基づいています。スプレッドシートは Web に接続できないため、API に変換しました。この API に必要なのは、製品 ID と各属性の選択だけで、価格が返されます。
属性とそのオプションを属性フィールドに入力すると、1 つの必須の any-any-any-any バリエーションとともに、ドロップダウンがすべてのオプションとともにフロントエンドに表示され、訪問者は製品をカートに追加することさえできることに気付きました。わーい!
しかし、最後の部分はわかりません。カート ページでは、選択した属性に基づいて価格を操作する必要があります。このコードはうまくいくはずです:
function prefix_get_api_price( $price, $product )
{
// if we have a product that uses the price api
if ( $product->is_type( 'variation' ) && get_field( 'has_api_price', $product->post->ID ) )
{
// get attributes
$variation_attributes = $product->get_variation_attributes();
// call the api, pass product id and chosen configuration
$api_results = price_api( $product->id, $variation_attributes );
// set the new/real/api price
$price = $api_results['price'];
}
// return
return $price;
}
add_filter( 'woocommerce_get_price', 'prefix_get_api_price', 10, 2 );
ただしget_variation_attributes()
、ユーザーが行った構成の選択ではなく、製品に設定したバリエーションのみを取得します (これはありません。any-any-any-any も表示されません)。
ここで選択肢を取得するにはどうすればよいですか?
または、同じ結果を別の方法で達成するにはどうすればよいでしょうか?
私が試した他のこと:
cart-item-data.php
属性の選択肢は、テンプレートを使用してカート ページに表示されますcart-item-data.php
。このファイルをハイジャックして、その変数を使用して価格を変更しました。これはうまくいきます!しかし、それは価格を設定していないようで、Woo の他の部分はそれで動いています。カートの小計と合計は、2 つの製品で 2 USD のままでした。(「システム」の価格は 1 米ドルでした。) これも非常にハックな方法であるため、これ以上詳しく調べませんでした。
WC()->cart->get_cart()
この関数は、カート内のすべてのものを、選択された製品属性を持つ製品データとともに返します。素晴らしい。これを上記のコードと統合しようとすると、残念ながら製品を一致させる確実な方法がないことに気付きましたget_cart()
woocommerce_get_price フック関数で取得したデータを使用します。例を挙げて説明しましょう。AAAA AABB と BBAA を構成して、Custom Product Alpha をカートに 3 回追加できます。これで、フックがカスタム製品を私に渡し始めます。最初に取得したのは AAAA、2 番目は AABB、3 番目は BBAA であると言えます。そして、私はそれを行いましたが、デバッグ時にすでに気づいたように、カスタム製品で woocommerce_get_price フックがすべての製品に対して 1 回だけでなく、何度もトリガーされます。理由はわかりませんが、そうです。そのため、最初の 3 回はカスタム価格を設定しましたが、システムのデフォルトで再度上書きされました。これをループする可能性があります..いいえ、フック内ですべてのカートを取得できないため、おそらくフックがカートページの途中で最初に呼び出されるため、これは機能しませんでした。できます' 私がこれで試したことを適切に説明することさえできません。それが機能したとしても、それは汚いハックでもあったでしょう。
Gravity Forms 製品アドオン (リンク)
これは、スプレッドシートの複雑さが、このプラグインで実行できる計算をはるかに超えていることが判明するまで、私の最初の計画でした。