2017-12-17 9 views
1

私は、オンラインで(Woocommerceを使用して)単一の変数製品を表示します。単一の製品ページにある場合、単一の製品ページ内の選択された製品に依存するために、いくつかの出力/テキストが必要です。私はPHPでこのコンディショニングを構築しています。WooCommerceでアクティブな選択した製品バリエーションの数量を取得

は、単一の製品については、これは簡単です:私は'woocommerce_before_add_to_cart_button'に引っ掛けています

$qty = $product->get_stock_quantity(); 
if ((...) and ($qty > 0)) { 
    ... 
} 

しかし、可変製品の場合、私はそれを動作させる方法を知りません。この場合、選択/アクティブ変動量を取得する必要があります。これは、クライアントがページのバリエーションを変更する可能性に対応する必要があります。

この質問は前が、ほとんどすべてのバリエーションではなく、現在のアクティブ/ 1のために提起されてきました。

誰かが光を放つことができたら、私は感謝します。それは主にクライアント側(サーバーではなく側)のライブイベントだとして選択バリエーション在庫数を取得する

答えて

0

唯一の方法は、jQueryの/ Javascriptを使用しています。

あなたの質問は本当にあなたがやりたいことに関連しているわけではないので、woocommerce_before_add_to_cart_buttonにフックされたカスタム関数関数があります。その関数私はPHPからJavaScriptのようにいくつかのデータを渡すには

  • カスタムメッセージは、株式の変動のうちに表示する
  • (それがためにも可能性があり、「在庫あり」)すべての有効変動在庫数量。

jQueryのコードが検出:

    (変化ID)が選択された変形
  • アクティブ選択変動がより

の在庫状況、このコードはできるもの:

  • 選択した品の在庫量を取得する選択した変動が在庫切れの際に変動(私はあなたがそれで何をしたいのか分からない)
  • は、カスタムメッセージを表示します。

jQueryコードには、選択したバリエーションの在庫数量を返す関数があります。すべてのプラグインファイルでも

add_action('woocommerce_before_add_to_cart_button', 'get_selected_variation_stock', 11, 0); 
function get_selected_variation_stock() { 
    global $product, $wpdb; 

    // HERE set your custom message 
    $message_outofstock = __('My custom "out of stock" message'); 

    // Get the visible product variations stock quantity 
    $variations_data = array(); 
    $child_ids = $product->get_visible_children(); 
    $child_ids = implode(',',$child_ids); 
    $results = $wpdb->get_results(" 
     SELECT p.ID, pm.meta_value as stock_qty 
     FROM {$wpdb->prefix}posts as p 
     INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id 
     WHERE p.post_type LIKE 'product_variation' 
     AND p.ID IN ($child_ids) AND pm.meta_key LIKE '_stock' 
    "); 

    foreach($results as $result){ 
     // Set in an indexed array for each variation ID the corresponding stock qty 
     $variations_data[$result->ID] = $result->stock_qty; 
    } 

    ?> 
    <script> 
    jQuery(document).ready(function($) { 
     var vData = <?php echo json_encode($variations_data); ?>, 
      stock = '.woocommerce-variation-availability > .stock'; 

     // Function that get the selected variation stock quantity and returns it 
     function getTheStockQty(a=vData){ 
      $.each(a, function(index, value){ 
       if(index == $('input.variation_id').val()) 
        return value; 
      }); 
     } 

     // Once loaded (if a variation is selected by default) 
     setTimeout(function(){ 
      var stockQty = getTheStockQty(); 
      if(0 < $('input.variation_id').val() && $(stock).hasClass('out-of-stock')){ // OUT OF STOCK 
       // Output a custom message for "out of stock" 
       $(stock).text('<?php echo $message_outofstock; ?>'); 
       // Testing output in the browser JS console 
       console.log('(1)'+$(stock).html()+' | Stock qty: '+stockQty); 
      } else if(0 < $('input.variation_id').val()) { // IN STOCK 
       // Testing output in the browser JS console 
       console.log('(2)'+$(stock).html()+' | Stock qty: '+stockQty); 
      } 
     }, 300); 

     // On live selected variation 
     $('select').blur(function(){ 
      var stockQty = getTheStockQty(); 
      if(0 < $('input.variation_id').val() && $(stock).hasClass('out-of-stock')){ // OUT OF STOCK 
       // Output a custom message for "out of stock" 
       $(stock).text('<?php echo $message_outofstock; ?>'); 
       // Testing output in the browser JS console 
       console.log('(1 live)'+$(stock).html()+' | Stock qty: '+stockQty); 
      } else if(0 < $('input.variation_id').val()) { // IN STOCK 
       // Testing output in the browser JS console 
       console.log('(2 live)'+$(stock).html()+' | Stock qty: '+stockQty); 
      } 
     }); 
    }); 
    </script> 
    <?php 
} 

このコードは、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルに行くか:ここで

は、このコード例です。

はテスト済みであり、このコードでは

を働く、あなたがしたいだけのようなものをカスタマイズするために必要なすべての基本コードを取得します。

+0

私はあなたのコードを使用し、それをうまく適合させました。しかし、私が商品ページに入ると、一種のちらつきが現れます。製品イメージと一部のコンテンツが縮小して正しく表示されたかのように。 – Lcapitao

+0

@Lcapitao私はテストサーバーでこの問題を抱えていません...これは確かにあなたのテーマに関連しています。これは実用的な例であり、このちらつきの問題を解決する方法を見つける必要があります。あなたは今、すべてのマテイルとその論理を持っています。この回答があなたの質問に答えている場合は、[この回答を受け入れたものとしてマークすることを忘れないでください](https://stackoverflow.com/help/someone-answers)。ありがとう – LoicTheAztec

関連する問題