2016-11-15 2 views
0

Je le problème suivant: orders pageFormulaire de contact 7 + WooCommerce - Enregistrer les données de formulaire dans les commandes

J'ai un formulaire de contact 7 avec 2 options déroulantes pour commander des billets pour un événement, pas d'enregistrement de l'utilisateur. Cela fonctionne bien, mais il n'enregistre aucune donnée de formulaire dans la page "commandes" de woocommerce comme l'image incluse, ce qui rend difficile le suivi des commandes. Dans d'autres paramètres du formulaire de contact Je suit:

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;};" 

qui insère l'ordre pour WooCommerce mais j'ai besoin des données client comme adresse de nom et votre email aussi. Malheureusement, je ne suis pas encore efficace avec ce type de code, quelqu'un peut-il me pousser dans la bonne direction?

Merci d'avance!

+0

Pourquoi utilisez-vous un CF7 pour commander un produit ? Vous semblez prendre cela du mauvais côté. Veuillez clarifier ce que vous voulez accomplir. – vard

+0

Le CF7 enregistre les données de formulaire dans le DB de formulaire de contact, qui a été demandé pour pouvoir ensuite exporter vers CSV. on_sent ajoute le produit dans woocommerce checkout, pour ensuite utiliser wirecard qui a également été demandé. L'étape manquante consiste à sauvegarder les données de champ de CF7 et à les insérer dans l'aperçu des commandes de woocommerce. – AaronK

+0

Je vois. Ce que vous devez essentiellement faire est d'accrocher 'wpcf7_mail_sent' pour enregistrer les données de formulaire en session puis les enregistrer plus tard dans les champs personnalisés lorsque la commande est créée (en utilisant l'action' woocommerce_checkout_order_processed') et les afficher sur la page de commande en utilisant des méta-boîtes. Si vous ne savez pas comment procéder, je vais élaborer une réponse. – vard

Répondre

1

Vous pouvez d'abord enregistrer vos données CF7 en session, afin de les enregistrer ultérieurement avec votre commande (sachant que la commande n'est pas encore créée à ce stade). Vous pouvez utiliser l'action wpcf7_mail_sent qui est déclenchée lorsque le courrier est envoyé. S'il vous plaît noter que tout le code suivant a lieu dans votre theme 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'); 

Cette utilisation de la classe Session WooCommerce WC_Session.

Enregistrez ensuite les données dans les champs personnalisés lorsque la commande est traitée:

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); 

Cela permettra d'économiser toutes les données de formulaire CF7 dans une chaîne sérialisée, stockées dans base64 pour éviter tout problème de décodage.

dernier, vous devez ajouter un meta box pour afficher les données de formulaire sur la page de commande:

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'); 

afficher ensuite les données:

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

comment puis-je limiter cette fonctionnalité à un formulaire? – FDI