2016-11-15 3 views
0

でフォームデータを保存:orders pageお問い合わせフォーム7 + WooCommerce - 私はこの問題を次のようしている受注

を私はイベントのチケットを注文するための2ドロップダウンオプションを使用してお問い合わせフォーム7、無いユーザ登録を持っています。これは正常に動作しますが、woocommerceの "orders"ページにはフォームデータが保存されません。連絡先フォームの追加設定で、私は次のようしている:Woocommerceに順番を挿入しますが、私はあまりにも名前の住所や電子メールなどの顧客データを必要とする

on_sent_ok: "switch(document.forms[0].elements["registration_type"].value){case "Normal Registration": location.replace('url/checkout-3/?clear-cart&add-to-cart=325&quantity=1');break;case "Presenter Registration": location.replace('url/checkout-3/?clear-cart&add-to-cart=327&quantity=1');break;};" 

を。残念ながら、私はまだこのタイプのコードでは効率的ではありません、誰かが正しい方向に私をバンプすることができますか?

ありがとうございます!

+0

なぜあなたは、製品を注文するCF7を使うのですか?あなたは間違った終わりからこれを取っているようです。達成したいことを明確にしてください。 – vard

+0

CF7は、後でCSVにエクスポートできるように要求されたフォームフォームDBにフォームデータを保存します。 on_sentは、woocommerceのチェックアウトに製品を追加し、要求されたワイヤカードを使用します。欠けているステップは、CF7からのフィールドデータを保存し、それをwoocommerceのオーダー概要に挿入することです。 – AaronK

+0

私は参照してください。 'wpcf7_mail_sent'をフックしてセッションにフォームデータを保存し、注文が作成されたときに(' woocommerce_checkout_order_processed'アクションを使って)カスタムフィールドに保存し、メタボックスを使って注文ページに表示します。あなたが進める方法がわからないなら、私は答えを打ち明けます。 – vard

答えて

1

まず、CF7データをセッションに保存して、後で注文を保存することができます(この時点で注文がまだ作成されていないことを考慮してください)。メールが送信されたときにトリガされるアクションは、wpcf7_mail_sentアクションを利用できます。 あなたのテーマfunctions.phpには、次のコードがすべて含まれています。

function wc_wpcf7_mail_sent_function($contact_form) { 
    $submission = WPCF7_Submission::get_instance(); 
    if($submission) { 
     $posted_data = $submission->get_posted_data(); 
     WC()->session->set('cf7_posted_data', $posted_data); 
    } 
} 
add_action('wpcf7_mail_sent', 'wc_wpcf7_mail_sent_function'); 

これはWoocommerce SessionクラスWC_Sessionを使用しています。

そして、注文が処理されたカスタムフィールドにデータを保存します。

function wc_save_cf7_data_to_order($order_id) { 
    $posted_data = base64_encode(serialize(WC()->session->get('cf7_posted_data'))); 
    if(!empty($posted_data)) { 
     add_post_meta($order_id, 'cf7_posted_data', $posted_data); 
     WC()->session->__unset('cf7_posted_data'); 
    } 
} 
add_action('woocommerce_checkout_order_processed', 'wc_save_cf7_data_to_order', 10, 1); 

これは、任意のデコードの問題を避けるために、BASE64に保存されているシリアル化された文字列内のすべてのCF7フォームデータを、保存されます。その後

function wc_add_meta_box() { 
    add_meta_box(
     'order_tickets', 
     __('Contact form data', 'your-theme'), 
     'wc_print_order_cf7_data_callback'), 
     'shop_order' 
    ); 
} 
add_action('add_meta_boxes', 'wc_add_meta_box'); 

データを表示:

最後、あなたは注文ページのフォームデータを表示するようにmeta boxを追加する必要が

public function print_order_tickets_callback($post) { 
    $posted_data = get_post_meta($post->ID, 'cf7_posted_data', true); 
    if(!empty($tickets)) { 
     $posted_data = unserialiaze(base64_decode($posted_data)); 
     foreach($posted_data as $key => $data) { 
      echo '<b>', $key, ' : </b> ', $data, '<br />'; 
     } 
    } 
} 
+0

この機能を1つのフォームに制限するにはどうすればよいですか? – FDI

関連する問題