2017-10-26 5 views
0

各製品に3つのバリエーション(小、中、大)があるストアを設定しています。各製品の各バリエーションには、100小、35中、15大の在庫が限られています。商品は限定版であるため、お客様の注文番号(original quantity - new quantity)を保存できるようにしたいと考えています。たとえば、誰かがProduct AのSmall variantを最初に購入した場合、その数は1になります。製品Aの小規模品種を購入した次の人物は2などとなり、その後はすべて100になります。その後、小文字は販売されなくなります。Woocommerce:バリエーションあたりのインクリメンタルオーダー番号

はここwoocommerce_checkout_update_order_metaにフック、私がこれまで持っているものです。

// Generate order number 
    $order = wc_get_order($order_id); 
    // Getting the items in the order 
    $order_items = $order->get_items(); 
    // Iterating through each item in the order 
    foreach ($order_items as $item_id => $item_data) { 
     $product = wc_get_product($item_data['product_id']); 
     $total = get_post_meta($product->id, 'total_sales', true); 
     $quantity = $product->get_stock_quantity(); 
     $max = $total + $quantity; 
     $number = $max - $quantity; 
     $name = $item_data['name']; 

     update_post_meta($order_id, $name.' - Print Number', $number); 
    } 

total_salesフィールドがバリエーションを追跡していないので、しかし、これは、正常に動作しません。代わりに、特定の製品の任意のバリエーションの合計売上を指します。

私は、各バリエーションの元の在庫を追跡し、注文が完了するたびに元の在庫から現在の変動量を差し引く方法を思いつきます。これを実現するためのアドバイスはありますか?私はこれを自動的に計算させて、各注文に対して手動でそれを行うために余分な時間を費やす必要はありません。 1.オリジナル製品の数量:あなたが何ができるか

答えて

2

は、各製品のバリエーションのための2つのカスタムフィールドを追加しているあなたは 2.総売上高からsubstractingされる数量:現在の販売数量

これらはあなたをできるようになりますそれぞれの変動量と売上高を記録します。

番号をオーダーまたはオーダーアイテムメタに追加してください。 1.メタフィールドの前にプロダクトIDを付けるなどして、オーダー全体に数量を追加することができます。 woocommerce_checkout_update_order_metaを使用します。

add_action('woocommerce_checkout_update_order_meta', 'prefix_add_order_meta', 10, 2); 
function prefix_add_order_meta($order_id, $data) { 
    // Generate order number 
    $order = wc_get_order($order_id); 

    // Getting the items in the order 
    $order_items = $order->get_items(); 

    /** 
    * @var WC_Order_Item_Product $item_data 
    */ 
    foreach ($order_items as $item_id => $item_data) { 
     $product  = $item_data->get_product(); 
     $total_sales = (int) get_post_meta($product->get_id(), 'custom_total_sales', true); 

     $item_number = $total_sales + 1; 

     // Add to order meta 
     $order->add_meta_data($product->get_id() . '_print_number', wc_clean($item_number), true); 
     $order->save(); 

     // Add to order item meta. You can set this here or use the 'woocommerce_checkout_create_order_line_item' 
     $item_data->add_meta_data('print_number', wc_clean($item_number), true); 
     $item_data->save(); 

     // Save total to product 
     $product->add_meta_data('custom_total_sales', wc_clean($item_number), true); 
     $product->save(); 
    } 
} 
  • あなたはオーダー項目にメタを追加するために'woocommerce_checkout_create_order_line_item'を使用することができます。アイテム自体として前に置くための必要はありませんここでは、製品
  • されていない例である:

    add_action('woocommerce_checkout_create_order_line_item', 'prefix_add_order_item_meta', 10, 4); 
    function prefix_add_order_item_meta($item, $cart_item_key, $values, $order) { 
        $product  = $item->get_product(); 
        $total_sales = (int) get_post_meta($product->get_id(), 'custom_total_sales', true); 
    
        $item_number = $total_sales + 1; 
    
        // Add to order item meta. No need to save here 
        $item->add_meta_data('print_number', wc_clean($item_number), true); 
    } 
    
    +0

    ありがとうございました!これは素晴らしく、私はついにそれを試す時間がありました。新製品の注文を完了した後、注文メタおよび注文項目メタは両方とも、印刷番号「1」で正しく設定されている。しかし、製品のページに行くと、カスタムフィールドには「custom_total_sales」はありません。これはバリエーションごとに処理されますか?そうであれば、設定されているかどうかを確認する別の領域がありますか? –

    +0

    product-> get_meta()でカスタムフィールドを取得してみてください。あなたが販売している製品がバリエーションであれば、はい、バリエーションにメタが保存されます。 – VanboDevelops

    +0

    クールなので、テストを終えてライブに備える準備が整ったら、バリエーションの 'custom_total_sales'をWordPressの管理者から0にリセットする方法はありますか? –

    0

    VanboDevelops'答えは非常に便利だったので、私は先に行って、受け入れ答えとしてそれをマーク。しかし、私はそれをやり終えたのか少し違っていました。私は、テストのためにだけでなく、注文がキャンセルされて印刷番号をロールバックする必要がある場合にも、限定版の番号を簡単に編集できるようにしたかったのです。私にとってので、ここで私はfunctions.phpに追加何だ、解決策は簡単などの価格、大きさ、一緒に編集することができますすべてのバリエーションにカスタムフィールドを作成することでした:

    このソリューションはまたかどうか、複数の考慮
    add_action('woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3); 
    function variation_settings_fields($loop, $variation_data, $variation) { 
        woocommerce_wp_text_input( 
         array( 
          'id'   => '_print_number[' . $variation->ID . ']', 
          'label'  => __('Print number (most recently sold)', 'woocommerce'), 
          'desc_tip' => 'true', 
          'description' => __('The most recently-sold Print Number for this size and print. WARNING: This value plus 1 is used to show the user which print number they will be purchasing. Only update this value manually in specific situations, such as if an order is canceled and the print number needs to be offset.', 'woocommerce'), 
          'value'  => get_post_meta($variation->ID, '_print_number', true), 
          'custom_attributes' => array(
              'step' => '1', 
              'min' => '1' 
             ) 
         ) 
        ); 
    } 
    add_action('woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2); 
    function save_variation_settings_fields($post_id) { 
        $number_field = $_POST['_print_number'][ $post_id ]; 
        if(!empty($number_field) || $number_field == 0) { 
         update_post_meta($post_id, '_print_number', esc_attr($number_field)); 
        } 
    } 
    add_filter('woocommerce_available_variation', 'load_variation_settings_fields'); 
    function load_variation_settings_fields($variations) { 
        $variations['print_number'] = get_post_meta($variations[ 'variation_id' ], '_print_number', true); 
    
        return $variations; 
    } 
    add_action('woocommerce_checkout_update_order_meta', 'prefix_add_order_meta', 10, 2); 
    function prefix_add_order_meta($order_id, $data) { 
        // Generate order number 
        $order = wc_get_order($order_id); 
    
        // Getting the items in the order 
        $order_items = $order->get_items(); 
    
        foreach ($order_items as $item_id => $item_data) { 
         $product = $item_data->get_product(); 
         $product_id = $product->get_id(); 
    
         // Update print number 
         $print_number = (int) get_post_meta($product_id, '_print_number', true); 
         $print_number += wc_clean($item_data['qty']); 
         update_post_meta($product_id, '_print_number', wc_clean($print_number)); 
    
         // Add to order meta 
         $order->add_meta_data($product_id . '_print_number', wc_clean($print_number), true); 
         $order->save(); 
        } 
    } 
    

    選択されたパターンのうちの1つが注文に含まれているため、たとえば、同じ写真の2枚の小さなプリントを選んだ場合、そのパターンのプリント番号は2ずつ増えます。このような場合、注文メタ情報には最新のプリント番号のみが表示されますが、数量と最終プリント番号を調べることで、出荷する番号を推測することができます。より堅牢なソリューションは、オーダーのメタデータにすべてのプリント番号を表示するのが理想的ですが、これは私の思うように機能します。

    関連する問題