2017-03-28 13 views
1

私は自分の情報(名前、電話番号、国、年齢など)を挿入するフォームを1つの商品ページに用意しています。詳細。チェックアウトカスタムフィールドで商品のカスタムフィールド値を取得する

私は、私は単一の製品で私のフォームに2つのフィールドを追加したものを、ここにコードがあるので、:

<div class="col-md-6"> 
       <div class="form-group"> 
        <input class="form-control alt" name="billing_vol" type="text" 
          placeholder="<?php esc_html_e('N° Vol : *', 'rentcar'); ?>" > 
       </div> 
      </div> 
      <div class="form-group"> 
       <input class="form-control alt" type="text" name="billing_cli_age" 
         placeholder="<?php esc_html_e('Age *', 'rentcar'); ?>" 
        " 
       > 
      </div><div class="col-md-6"> 
       <div class="form-group"> 
        <?php 
         global $woocommerce; 
         $countries_obj = new WC_Countries(); 
         $countries = $countries_obj->__get('countries'); 
        ?> 

        <?php 
         woocommerce_form_field('billing_country', array(
         'type'  => 'select', 
         'class'  => array('chzn-drop'), 
         'placeholder' => __('Country'), 
         'options' => $countries 
         ) 
         ); 
        ?> 

       </div> 
      </div> 

それから私は、課金の詳細をフォームにチェックアウトページで同じことをした、私が追加しましたこの2つのフィールド。ここでは、コードは次のとおりです。

add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields'); 

function custom_override_checkout_fields($fields) { 

    $fields['billing']['billing_cli_age'] = array(
     'label'   => __('Age ', 'woocommerce'), 
     'placeholder' => _x('Age ', 'placeholder', 'woocommerce'), 
     'required'  => false, 
     'class'   => array('form-row-wide'), 
     'clear'   => true 
    ); 

    $fields['billing']['billing_vol'] = array(
     'label'   => __('N° vol', 'woocommerce'), 
     'placeholder' => _x('N° vol', 'placeholder', 'woocommerce'), 
     'required'  => false, 
     'class'   => array('form-row-wide'), 
     'clear'   => true 
    ); 
    return $fields; 
} 

は、今私はこだわっている、私はチェックアウトのページに形成課金詳細に(私は単一の製品を持っていること)の形で、ユーザーが追加した情報を送信する方法がわかりません。

どうすればこの問題を解決できますか?

ありがとうございました。

答えて

1

ここには、カートにカートが私たちのチェックアウトカスタムフィールドに入力されたときに値を送信した商品カスタムフィールドを取得するための完全な機能コードがあります。

最初の機能はテスト目的にすぎません。しかし、あなたの製品カスタムフィールドのコードは、この作業をするために、カートに追加するフォームの中にあるべきです。ここで

add_action('woocommerce_before_add_to_cart_button', 'action_before_add_to_cart_button',20); 
function action_before_add_to_cart_button() { 
    ?> 
     <div class="col-md-6"> 
      <div> 
       <input class="form-control alt" name="billing_vol" type="text" 
         placeholder="<?php esc_html_e('N° Vol : *', 'rentcar'); ?>"> 
      </div> 
      <div> 
       <input class="form-control alt" type="text" name="billing_cli_age" 
         placeholder="<?php esc_html_e('Age *', 'rentcar'); ?>"> 
      </div> 
      <div class="form-group"> 
      <?php 
       // Getting the countries (simplified) 
       $countries = WC()->countries->get_countries(); 

       woocommerce_form_field('billing_country', array(
        'type'  => 'select', 
        'class'  => array('chzn-drop'), 
        'placeholder' => __('Country'), 
        'options' => $countries 
       )); 
      ?> 
      </div> 
     </div> 
    <?php 
} 

カートにあなたの製品のカスタムフィールドの値を渡します欠けているフック関数で、次のとおりです。

// Store the data fields to cart 
add_action('woocommerce_add_cart_item_data', 'action_save_my_custom_product_fields', 10, 2); 
function action_save_my_custom_product_fields($cart_item_data, $product_id) { 
    $bool = false; 
    $data = array(); 
    if(isset($_REQUEST['billing_vol'])) { 
     $cart_item_data['custom_data']['billing_vol'] = $_REQUEST['billing_vol']; 
     $data['billing_vol'] = $_REQUEST['billing_vol']; 
     $bool = true; 
    } 
    if(isset($_REQUEST['billing_cli_age'])) { 
     $cart_item_data['custom_data']['billing_cli_age'] = $_REQUEST['billing_cli_age']; 
     $data['billing_cli_age'] = $_REQUEST['billing_cli_age']; 
     $bool = true; 
    } 
    if(isset($_REQUEST['billing_country'])) { 
     $cart_item_data['custom_data']['billing_country'] = $_REQUEST['billing_country']; 
     $data['billing_country'] = $_REQUEST['billing_country']; 
     $bool = true; 
    } 
    if($bool) { 
     // below statement make sure every add to cart action as unique line item 
     $unique_key = md5(microtime().rand()); 
     $cart_item_data['custom_data']['unique_key'] = $unique_key; 
     $data['unique_key'] = $unique_key; 
     WC()->session->set('custom_data', $data); 
    } 
    return $cart_item_data; 
} 

を使用すると、複数のカートを持っているように、あなたが得るために、ループを分割する必要があります。のみ最初の項目のカスタム値:

add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields'); 
function custom_override_checkout_fields($fields) { 

    // We break the loop to get the custom data from 1 cart item 
    foreach(WC()->cart->get_cart() as $cart_item) break; 

    $data = $cart_item['custom_data']; 

    // COUNTRIES: Getting the countries (simplified) 
    $countries = WC()->countries->get_countries(); 
    $billing_country_key = $data['billing_country']; 
    $billing_country_value = $countries[$billing_country_key]; 

    $fields['billing']['billing_cli_age'] = array(
     'type'   => 'text', 
     'label'   => __('Age ', 'woocommerce'), 
     'placeholder' => _x('Age ', 'placeholder', 'woocommerce'), 
     'required'  => false, 
     'class'   => array('form-row-wide'), 
     'clear'   => true, 
     'default'  => $data['billing_cli_age'], 
    ); 

    $fields['billing']['billing_vol'] = array(
     'type'   => 'text', 
     'label'   => __('N° vol', 'woocommerce'), 
     'placeholder' => _x('N° vol', 'placeholder', 'woocommerce'), 
     'required'  => false, 
     'class'   => array('form-row-wide'), 
     'clear'   => true, 
     'default'  => $data['billing_vol'], 
    ); 

    $fields['billing']['billing_country'] = array(
     'type' => 'select', 
     'default' => $billing_country_key, 
     'options' => array($billing_country_key => $billing_country_value), 
    ); 

    return $fields; 
} 

コードは、任意のプラグインファイルでも、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルになりますか。

このコードはテスト済みであり、動作します。

国のフィールドは静かで、Javascript/Ajaxもそれに関係しています。ユニークな「選択」「オプション」では、複数の選択オプションがありますが、機能しません。

+0

あなたは天才ですが、このコードで動作します。私は選択フィールドがあるため、私は単一の製品ですべての値を取得します – Hanane

+0

@ハナン選択フィールドには非常に似ています。あなたのすべてのフィールドで質問をして、私はそれをテストして、それをテストすることができます...それはあなた次第です – LoicTheAztec

+0

あなたの助けに感謝Loic。私は3番目のフィールド "billing_country"を追加するために私の質問を編集しました。だから私が望むのは、請求書明細書フォームにあるbilling_countryが単一の製品フォームから価値を得るということです。 – Hanane

関連する問題